我的 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 上崩溃,而在其他操作系统上不会崩溃吗?
P/Invokes 是否有自己的不可见的低级汇编错误处理程序 try/catch,比我的 C# 程序执行更强大?
在视觉上,当它运行时,我看到我的程序 UI 快速闪烁了很多次,我猜是 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 的不同计算机上的行为不同。