Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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# 使用BlockInput阻止键盘和鼠标输入_C#_.net_Wpf - Fatal编程技术网

C# 使用BlockInput阻止键盘和鼠标输入

C# 使用BlockInput阻止键盘和鼠标输入,c#,.net,wpf,C#,.net,Wpf,这是一个触摸板虚拟键盘按钮。当我按下屏幕上的“触摸”按钮时,将显示“ab”。我正在尝试使用BlockInput来阻止鼠标和键盘在按下触摸按钮后的2秒钟内进行任何输入。但是它不起作用,我想需要为块输入设置一个计时器,我知道怎么做吗?这是我的密码: public partial class TRY { [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "BlockInpu

这是一个触摸板虚拟键盘按钮。当我按下屏幕上的“触摸”按钮时,将显示“ab”。我正在尝试使用BlockInput来阻止鼠标和键盘在按下触摸按钮后的2秒钟内进行任何输入。但是它不起作用,我想需要为块输入设置一个计时器,我知道怎么做吗?这是我的密码:

public partial class TRY
    {
        [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "BlockInput")]
        [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
        public static extern bool BlockInput([System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] bool fBlockIt);
    }

public void TOUCH(string key)
    {  
        if (key == "Press")
        {
            PressAndRelease("a");
            PressAndRelease("b");
            ReleaseKeys();

            TRY.BlockInput(true);
            Thread.Sleep(2000);
            TRY.BlockInput(false);
        }
    }
BlockInput()无法在触摸设备上可靠工作,因为鼠标消息通常作为触摸消息发送,反之亦然。有两种方法可以阻止触摸输入:

1) HID类过滤器驱动程序安装将阻止来自HID设备的所有触摸信息。需要开发一个过滤器驱动程序,并且需要一个具有内核代码签名功能的代码签名证书,才能在非测试机器上安装该驱动程序

2) 钩住所有进程,32位和64位,并在此期间阻止所有消息,包括触摸消息,如下所示:

    hkKey  = SetWindowsHookEx(WH_CALLWNDPROC, procTouchMsg, hInstHookDll, 0);
    hkKey2 = SetWindowsHookEx(WH_CALLWNDPROCRET, procTouchMsg, hInstHookDll, 0);
    hkKey3 = SetWindowsHookEx(WH_GETMESSAGE, procTouchMsg, hInstHookDll, 0);

    hkKey4 = SetWindowsHookEx(WH_SYSMSGFILTER, procTouchMsg, hInstHookDll, 0);
    hkKey5 = SetWindowsHookEx(WH_MSGFILTER, procTouchMsg, hInstHookDll, 0);
    hkKey6 = SetWindowsHookEx(WH_MOUSE, procTouchMsg, hInstHookDll, 0);
    hkKey7 = SetWindowsHookEx(WH_MOUSE_LL, procTouchMsg, hInstHookDll, 0);
    hkKey8 = SetWindowsHookEx(WH_KEYBOARD, procTouchMsg, hInstHookDll, 0);
    hkKey9 = SetWindowsHookEx(WH_KEYBOARD_LL, procTouchMsg, hInstHookDll, 0);   

然后只需从procTouchMsg函数返回NULL。小心-这可能会禁用设备的所有输入,以便在几秒钟后停止挂钩或排除某些重要进程的挂钩。

如果没有检查错误,则忽略BlockInput()返回值。当然,你不知道为什么它不起作用。返回false时抛出Win32Exception。@HansPassant:Thx获取您的信息。我的代码在编译时没有错误。但是在
Thread.Sleep(2000)
期间,仍然可以接收用户的输入。你能告诉我修复它的方法吗?避免在这个(UI?)线程中使用睡眠,并使用后台工作程序。