Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自P/Invoke函数的奇怪行为-魔术循环_C#_Pinvoke - Fatal编程技术网

C# 来自P/Invoke函数的奇怪行为-魔术循环

C# 来自P/Invoke函数的奇怪行为-魔术循环,c#,pinvoke,C#,Pinvoke,我的C#程序有一种非常奇怪的行为。我在这个程序中使用了四种“黑客”pinvoke方法:GlobalKeyHooking、热键注册、setforegroundindow/getforegroundindow和SendKeys.Send/SendWait 这就是我不理解的行为。我在一个程序中窃取了Ctrl+V,其中标准的剪切/复制和粘贴例程被列表框中出现和消失的自动完成列表所取代。在一些装有Windows 7的计算机上,我的程序运行得很好,在另外50%装有Windows 7的计算机上(遗憾的是,没有

我的C#程序有一种非常奇怪的行为。我在这个程序中使用了四种“黑客”pinvoke方法:GlobalKeyHooking、热键注册、setforegroundindow/getforegroundindow和SendKeys.Send/SendWait

这就是我不理解的行为。我在一个程序中窃取了Ctrl+V,其中标准的剪切/复制和粘贴例程被列表框中出现和消失的自动完成列表所取代。在一些装有Windows 7的计算机上,我的程序运行得很好,在另外50%装有Windows 7的计算机上(遗憾的是,没有VS2010来调试它),一个非常奇怪的循环出现在一个方法内部。由于Ctrl和V本身是钩住的,所以我已经阻止了该方法被无限触发。没关系。但另一个循环出现在方法内部

简而言之:myDebugValue会一直增加,直到达到23-24-25!因此,在决定停止之前,有些东西多次尝试执行一个函数

有没有人见过类似的意外循环?即使没有try/catch块,它也会在函数内部反弹

某些p/Invokes函数在某些Windows 7上会崩溃吗

p/调用是否有自己的不可见的低级汇编程序错误处理程序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的不同计算机上的作用不同。

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

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