2012-01-12 7 views
1

私が書いているアプリケーションの1つでは、特定のキーイベントを消費する必要があるため、他のアプリケーションでそれらを処理しないようにする必要があります。私はそうのようなcom.sun.jna.platform.win32.WinUser.LowLevelKeyboardProcを作る私のコードでjnaを使用してキーイベントを消費する

import com.sun.jna.Native; 
import com.sun.jna.platform.win32.Kernel32; 
import com.sun.jna.platform.win32.WinDef.HMODULE; 
import com.sun.jna.platform.win32.WinDef.LRESULT; 
import com.sun.jna.platform.win32.WinDef.WPARAM; 
import com.sun.jna.platform.win32.WinUser.HHOOK; 
import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT; 
import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc; 
import com.sun.jna.platform.win32.User32; 
import com.sun.jna.platform.win32.WinUser; 

public class KeyHook implements Runnable{ 

private static volatile boolean quit = false; 
private static HHOOK hhk; 
private static LowLevelKeyboardProc keyboardHook; 

private Main main; 
User32 lib; 
HMODULE hMod; 
public boolean isHooked = false; 

public KeyHook(final Main main) { 
    this.main = main; 
    lib = User32.INSTANCE; 
    hMod = Kernel32.INSTANCE.GetModuleHandle(null); 
    Native.setProtected(true); 
} 

@Override 
public void run() { 
    keyboardHook = new LowLevelKeyboardProc() { 
     public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) { 
      if (nCode >= 0 && main.getPane().getTabCount() > 0) { 
       switch (wParam.intValue()) { 
        case WinUser.WM_KEYUP: 
         if(info.vkCode == main.getListenMouse()){ 
          main.listen(); 
          return new LRESULT(1); 
         } 
         else if(info.vkCode == main.getStopListenMouse()){ 
          main.stopListening(); 
          return new LRESULT(1); 
         } 
         else if(info.vkCode == main.getStart()){ 
          main.start(); 
          return new LRESULT(1); 
         } 
         else if(info.vkCode == main.getPause()){ 
          main.pause(); 
          return new LRESULT(1); 
         } 
         else if(info.vkCode == main.getStop()){ 
          main.stopRunning(); 
          return new LRESULT(1); 
         } 
         else if(info.vkCode == 0x7B){ 
          main.nextTab(); 
          return new LRESULT(1); 
         } 
         break; 
        case WinUser.WM_KEYDOWN: 
         break; 
        case WinUser.WM_SYSKEYUP: 
         break; 
        case WinUser.WM_SYSKEYDOWN: 
         quit = true; 
         break; 
       } 
      } 
      return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer()); 
      //return new LRESULT(1); 
     } 
    }; 
    hhk = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardHook, hMod, 0); 
} 
} 

私は私のPROCの最後に新しいLRESULT(1)を返す場合には(コメント終了コード)、すべてのキーボードイベントが消費されます。それは、唯一私が消費したいメインのキーボードイベントを消費してみてくださいしかし、私は

return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer()); 

と交換するとき、それはキーボードイベントのいずれかを消費しません。誰かが私が望む出来事を消費させないようにする理由があるのか​​、どうやってそれを修正するのか考えていない理由を知っている人はいますか?

+0

イベントを消費したくない場合にのみ、次のフックを呼び出し、* do *を実行したときにLRESULT(1)を返します。おそらく、消費可能なイベントにフラグを立てようとしているコードが実際に呼び出されていないのでしょうか? – technomage

+0

http://stackoverflow.com/questions/8540891/using-jna-to-keyhook-and-consume – technomage

+0

を参照してください。@technomage:私は個人的なイベントのために消費したいときにLRESULT(1)を返します。私が言っていることは、私が個々の出来事のためにそれをするとき、それを消費しないということです。そしてその質問をしばらく前から私の質問だった、私はLRESULT(1)でnextHookを置き換えるときに解決しますが、そのとき、すべてのキーイベントを消費します。 –

答えて

1

キーが「消費される」ようにするには、特定のキー(WM_KEYUP、WM_KEYDOWNなど)のすべてのイベントバリアントで次のフック(つまり、LRESULT(1)を返す)を避ける必要があります。おそらくWM_CHAR。キーストロークが適切に「消える」と述べ

一部のアプリケーションでは、単に生産文字出力用にキーアップイベント、ダウンキーの他、他を探すことができるので、あなたが作るために指定されたキーストロークに関連すべてイベントを消費しなければなりません。

関連する問題