posts - 59, comments - 244, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          java鼠標鉤子實現

          Posted on 2010-12-17 00:49 penngo 閱讀(5240) 評論(2)  編輯  收藏
          java本身是沒有提供直接訪問系統的API方法,查了下資料,要實現鼠標鉤子有3種方法,
          1、使用JNI方法,需要自己寫C實現,比較復雜。
          2、使用swt extension,直接提供了鼠標鉤子的實現,但是用它調用其它windows api,沒有成功,放棄了使用它。
          3、使用JNA,JNA是建立在JNI 技術之上的,簡化了Java訪問window api的方法。
          考慮到要調用其它window api的原因,選用了JNA,順便寫一個JNA實現鼠標鉤子的測試例子:

          public class MouseHook extends JFrame {
              
          private static final long serialVersionUID = 1L;
              
          public static final int WM_MOUSEMOVE = 512;
              
          public static final int WM_LBUTTONDOWN = 513;
              
          public static final int WM_LBUTTONUP = 514;
              
          public static final int WM_RBUTTONDOWN = 516;
              
          public static final int WM_RBUTTONUP = 517;
              
          public static final int WM_MBUTTONDOWN = 519;
              
          public static final int WM_MBUTTONUP = 520;
              
          private static HHOOK hhk;
              
          private static LowLevelMouseProc mouseHook;

              
          private JLabel labelX;
              
          private JLabel labelY;
              
          private JPanel contentPane;

              
          public static void main(String[] args) {
                  
          final MouseHook frame = new MouseHook();
                  frame.setVisible(
          true);

                  
          final User32 lib = User32.INSTANCE;
                  HMODULE hMod 
          = Kernel32.INSTANCE.GetModuleHandle(null);
                  mouseHook 
          = new LowLevelMouseProc() {
                      
          public LRESULT callback(int nCode, WPARAM wParam,
                              MOUSEHOOKSTRUCT info) 
          {
                          
          if (nCode >= 0{
                              
          switch (wParam.intValue()) {
                              
          case MouseHook.WM_MOUSEMOVE:
                                  System.err.println(
          "in callback,  x=" + info.pt.x
                                          
          + " y=" + info.pt.y);
                                  frame.getLabelX().setText(String.valueOf(info.pt.x));
                                  frame.getLabelY().setText(String.valueOf(info.pt.y));
                              }

                          }

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

                  }
          ;
                  hhk 
          = lib.SetWindowsHookEx(User32.WH_MOUSE_LL, mouseHook, hMod, 0);

                  
          int result;
                  MSG msg 
          = new MSG();
                  
          while ((result = lib.GetMessage(msg, null00)) != 0{
                      
          if (result == -1{
                          System.err.println(
          "error in get message");
                          
          break;
                      }
           else {
                          System.err.println(
          "got message");
                          lib.TranslateMessage(msg);
                          lib.DispatchMessage(msg);
                      }

                  }

                  lib.UnhookWindowsHookEx(hhk);
              }


              
          public MouseHook() {
                  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  setBounds(
          100100450300);
                  contentPane 
          = new JPanel();
                  contentPane.setBorder(
          new EmptyBorder(5555));
                  setContentPane(contentPane);
                  contentPane.setLayout(
          null);

                  JLabel lblX 
          = new JLabel("X:");
                  lblX.setFont(
          new Font("宋體", Font.PLAIN, 14));
                  lblX.setBounds(
          46332227);
                  contentPane.add(lblX);

                  JLabel lblY 
          = new JLabel("Y:");
                  lblY.setFont(
          new Font("宋體", Font.PLAIN, 14));
                  lblY.setBounds(
          144391715);
                  contentPane.add(lblY);

                  labelX 
          = new JLabel("");
                  labelX.setBounds(
          65395415);
                  contentPane.add(labelX);

                  labelY 
          = new JLabel("");
                  labelY.setBounds(
          160395415);
                  contentPane.add(labelY);
              }


              
          public JLabel getLabelX() {
                  
          return labelX;
              }


              
          public void setLabelX(JLabel labelX) {
                  
          this.labelX = labelX;
              }


              
          public JLabel getLabelY() {
                  
          return labelY;
              }


              
          public void setLabelY(JLabel labelY) {
                  
          this.labelY = labelY;
              }


              
          public interface LowLevelMouseProc extends HOOKPROC {
                  LRESULT callback(
          int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam);
              }


              
          public class Point extends Structure {
                  
          public class ByReference extends Point implements Structure.ByReference {
                  }
          ;
                  
          public com.sun.jna.NativeLong x;
                  
          public com.sun.jna.NativeLong y;
              }


              
          public static class MOUSEHOOKSTRUCT extends Structure {
                  
          public static class ByReference extends MOUSEHOOKSTRUCT implements
                          Structure.ByReference 
          {
                  }
          ;

                  
          public User32.POINT pt;
                  
          public User32.HWND hwnd;
                  
          public int wHitTestCode;
                  
          public User32.ULONG_PTR dwExtraInfo;
              }

          }

          源碼

          評論

          # Antique Oil Painting  回復  更多評論   

          2010-12-17 17:19 by Antique Oil Painting
          怎么都是些代碼啊 唉

          # re: java鼠標鉤子實現  回復  更多評論   

          2014-06-16 10:00 by wholwh
          謝謝參考

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 天水市| 彰武县| 玛曲县| 佛学| 临澧县| 伊吾县| 大庆市| 凤山县| 仁化县| 宜章县| 安远县| 罗田县| 天津市| 余庆县| 农安县| 梨树县| 平度市| 达拉特旗| 大渡口区| 宁明县| 昌宁县| 西贡区| 锦州市| 东宁县| 海阳市| 苍溪县| 云林县| 西乌珠穆沁旗| 和顺县| 南宫市| 白城市| 哈尔滨市| 临清市| 阳信县| 敖汉旗| 广河县| 普格县| 卢氏县| 故城县| 灵台县| 镇平县|