4

我的 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 的不同计算机上的行为不同。

4

1 回答 1

0

不想回答我自己的问题,但总有第一次。我决定使用类似于InputSimulator的方法来实现我的目标并避免使用 SendKeys。现在,一切都在所有机器上完美运行。

我看到 InputSimulator 与我所有使用 Windows 7 的机器兼容,并且使用的是 SendInput 而不是 SendMessage 或 SendKeys,所以我在我的应用程序中使用了 SendInput。

于 2012-05-13T03:25:45.507 回答