2012-04-04 127 views
0

这里的一个触摸板虚拟键盘按钮。当我按下屏幕上的'TOUCH'时,将会显示'ab'。我试图使用了BlockInput防止鼠标和键盘的任何输入在2秒内按下触摸按键之后。但它不起作用,我认为需要为BlockInput设置一个定时器,any1知道该怎么做?这里是我的代码:使用了BlockInput到方框键盘和鼠标输入

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); 
     } 
    } 
+0

你是不是检查错误,你忽略了BlockInput()的返回值。所以确定,你不知道为什么它不起作用。当它返回false时抛出一个Win32Exception。 – 2012-04-04 05:09:00

+0

@HansPassant:THX乌拉圭回合信息。当我尝试编译它时,我的代码没有错误。但是在'Thread.Sleep(2000)'的时候,仍然可以接收用户的输入。你能告诉我解决问题的方法吗? – hakunabean 2012-04-04 06:32:15

+0

避免在此(UI?)线程中使用睡眠并使用后台工作程序。 – 2012-04-04 11:27:26

回答

0

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。要小心 - 这可能禁用所有输入到您的设备,以便要么停止后勾几秒钟或通过挂钩排除一些生命过程。