我的C#程序有一种非常奇怪的行为。我在这个程序中使用了四个''hacky''pinvoke方法:GlobalKeyHooking,HotKey Registering,SetForegroundWindow / GetForegroundWindow和SendKeys.Send / SendWait。
这是我不理解的行为。我正在程序中窃取Ctrl + V,其中标准剪切/复制和粘贴例程被列表框中的自动完成列表替换,该列表框出现并消失。在一些装有Windows 7的计算机上,我的程序就像一个魅力,在其他50%的Windows 7计算机上(可悲的是没有VS2010来调试它),一个非常奇怪的循环出现---内部---一种方法。由于Ctrl和V本身被挂钩,我已经阻止了无限触发方法。没关系。但是方法内部会出现另一个循环。
简单地说:myDebugValue增加到23-24-25!因此,在决定停止之前,有很多事情试图执行一个函数。
有没有人见过类似的不良循环?即使没有try / catch块,它也会在函数内部弹跳。
某些P / Invokes功能是否会在某些Windows 7上崩溃,而在其他Windows 7上却不会崩溃?
P / Invokes是否有自己的不可见的低级汇编错误处理程序try / catch,比我的C#程序执行更强大?
从视觉上来说,当它正在进行时,我发现我的程序用户界面很快闪了很多次,我想是25次。
private bool getOutOfHere = false;
private int myDebugValue = 0;
private void globalKeyHooking_KeyUp(object sender, KeyEventArgs e)
{
if (getOutOfHere) return;
myDebugValue = 0;
if (e.KeyCode == Keys.LControlKey)
{
getOutOfHere = true;
SendKeys.SendWait("^v");
getOutOfHere = false;
myDebugValue++;
}
}
我尝试使用2.0,3.0和4.0编译,并且在相同的4台计算机上,在所有情况下,它仍然是相同的速率:50%崩溃,50%工作。
[编辑]
我真的认为SendKeys.Send在使用Windows 7的不同计算机上的行为方式不同。
答案 0 :(得分:0)
不想回答我自己的问题,但始终是第一次。 我决定使用类似于InputSimulator的方法来实现我的目标并避免使用SendKeys。现在,一切都在所有机器上完美运行。
我看到InputSimulator与我使用Windows 7的所有机器兼容,并使用SendInput而不是SendMessage或SendKeys,因此我在我的应用程序中使用了SendInput。