2012-04-04 3 views
0

Hier ist eine virtuelle Touchpad-Taste. Wenn ich die 'TOUCH' auf dem Bildschirm drücke, wird 'ab' angezeigt. Ich versuche BlockInput zu verwenden, um die Eingabe von Maus und Tastatur für 2 Sekunden zu verhindern, direkt nachdem die TOUCH-Taste gedrückt wurde. Aber es funktioniert nicht, ich denke, man muss einen Timer für den BlockInput setzen, any1 weiß, wie man das macht? Hier ist mein Code:Verwenden von BlockInput zum Sperren der Tastatur- und Mauseingabe

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

Sie suchen nicht nach Fehlern, Sie ignorieren den Rückgabewert von BlockInput(). Sie können also nicht wissen, warum es nicht funktioniert. Wirf eine Win32Exception, wenn sie false zurückgibt. –

+0

@HansPassant: Thx für Ihre Info. Mein Code hat keinen Fehler, wenn ich versuche, es zu kompilieren. Aber in der Zeit von 'Thread.Sleep (2000)' kann die Benutzereingabe immer noch empfangen werden. Kannst du mir den Weg zeigen, es zu reparieren? – hakunabean

+0

Vermeiden Sie den Schlaf in diesem (UI?) Thread und verwenden Sie einen Hintergrund-Worker. –

Antwort

0

Blockinput() nicht zuverlässig auf Touch-Geräten arbeiten, wie Maus-Nachrichten häufig als Touch-Nachrichten weitergeleitet werden und umgekehrt. Es gibt zwei Möglichkeiten, die Berührungseingabe zu blockieren:

1) Eine HID-Klassenfiltertreiberinstallation, die alle Berührungsnachrichten blockiert, die von HID-Geräten kommen. Ein Filtertreiber müsste entwickelt werden und ein Code-Signing-Zertifikat mit Kernel-Code-Signatur-Funktion wäre erforderlich, damit der Treiber auf Nicht-Testmaschinen installiert werden kann.

2) Haken Sie alle Prozesse, 32 und 64 Bit, und währenddessen Zeitblock alle Nachrichten einschließlich Touch-Nachrichten in etwa wie folgt:

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); 

Dann einfach NULL zurück aus der procTouchMsg Funktion. BE CAREFULL - dies könnte alle Eingaben auf Ihrem Gerät deaktivieren, also entweder den Hook nach einigen Sekunden beenden oder das Hooking für wichtige Prozesse ausschließen.

Verwandte Themen