posts - 59, comments - 244, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          java本身是沒(méi)有提供直接訪問(wèn)系統(tǒng)的API方法,查了下資料,要實(shí)現(xiàn)鼠標(biāo)鉤子有3種方法,
          1、使用JNI方法,需要自己寫C實(shí)現(xiàn),比較復(fù)雜。
          2、使用swt extension,直接提供了鼠標(biāo)鉤子的實(shí)現(xiàn),但是用它調(diào)用其它windows api,沒(méi)有成功,放棄了使用它。
          3、使用JNA,JNA是建立在JNI 技術(shù)之上的,簡(jiǎn)化了Java訪問(wèn)window api的方法。
          考慮到要調(diào)用其它window api的原因,選用了JNA,順便寫一個(gè)JNA實(shí)現(xiàn)鼠標(biāo)鉤子的測(cè)試?yán)樱?br />
          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;
              }

          }

          源碼

          評(píng)論

          # Antique Oil Painting  回復(fù)  更多評(píng)論   

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

          # re: java鼠標(biāo)鉤子實(shí)現(xiàn)  回復(fù)  更多評(píng)論   

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

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 咸丰县| 宝鸡市| 杭州市| 饶阳县| 高碑店市| 北流市| 九龙城区| 福安市| 山东省| 上杭县| 繁峙县| 嘉峪关市| 吉木萨尔县| 筠连县| 丰城市| 松滋市| 静乐县| 瑞丽市| 晋州市| 新化县| 寻甸| 丹江口市| 渭源县| 鹿泉市| 通州市| 河池市| 灵武市| 迁西县| 云霄县| 瑞丽市| 比如县| 股票| 牡丹江市| 大余县| 安吉县| 盐城市| 长岭县| 古交市| 花莲县| 江津市| 上高县|