为了保持自己的兴趣,我试着在我的项目中放一些复活节彩蛋(主要是为了自娱自乐)。我见过一些网站,在那里你可以键入一系列字母"aswzaswz",然后得到一个"秘密函数"——我如何在C#中实现这一点?
我过去通过使用修改键分配了一个"秘密功能"
bool showFunThing = (Control.ModifierKeys & Keys.Control) == Keys.Control;
但我想变得更隐秘一点(没有修饰键),我只想让表单在没有任何输入的情况下检测某个键入的单词。。。我已经建立了一个我认为应该做到的方法:
private StringBuilder _pressedKeys = new StringBuilder();
protected override void OnKeyDown(KeyEventArgs e)
{
const string kWord = "fun";
char letter = (char)e.KeyValue;
if (!char.IsLetterOrDigit(letter))
{ return; }
_pressedKeys.Append(letter);
if (_pressedKeys.Length == kWord.Length)
{
if (_pressedKeys.ToString().ToLower() == kWord)
{
MessageBox.Show("Fun");
_pressedKeys.Clear();
}
}
base.OnKeyDown(e);
}
现在我需要把它连接起来,但我不知道我应该如何在表单设计器中提出这个事件。。。我试过这个:
this.KeyDown +=new System.Windows.Forms.KeyEventHandler(OnKeyDown);
以及一些变体,但我缺少了一些东西,因为它不会启动(或编译)。它告诉我OnKeyDown方法需要一个特定的签名,但我有其他类似的方法,其中我没有指定参数。
我担心我可能弄糊涂了,所以我向so寻求帮助。。。任何人
编辑:ProcessCmdKey似乎是处理以下内容的方法:
private StringBuilder _pressedKeys = new StringBuilder();
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const string kWord = "fun";
char letter = (char)keyData;
if (!char.IsLetterOrDigit(letter))
{return true;}
_pressedKeys.Append(letter);
if (_pressedKeys.Length == kWord.Length)
{
if (_pressedKeys.ToString().ToLower() == kWord)
{
MessageBox.Show("Fun");
_pressedKeys.Clear();
}
_pressedKeys.Clear();
}
return true;
}
谢谢大家!
试试这个:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.P|Keys.Control))
{
//do my prank
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
当你按下CTRL+p时,它会触发。
参考:ProcessCmdKey
在消息预处理期间调用此方法以处理命令键。命令键是始终优先于常规键的键输入键。命令键的示例包括快捷键和菜单快捷方式。该方法必须返回true以指示它具有已处理命令密钥
您正在重写一个虚拟方法,因此不需要处理KeyDown事件。如果您进行调试,那么如果有东西调用了虚拟方法,那么您应该在覆盖方法中遇到断点。
你确定你在正确的类中重写了正确的方法吗?只是一个想法。