<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    java鼠標鉤子實現

    Posted on 2010-12-17 00:49 penngo 閱讀(5239) 評論(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
    謝謝參考

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


    網站導航:
     
    主站蜘蛛池模板: 免费在线观看黄网站| 91香蕉视频免费| 成年网在线观看免费观看网址| 亚洲一欧洲中文字幕在线| 色偷偷女男人的天堂亚洲网| 免费无码婬片aaa直播表情| 国产一级片免费看| free哆啪啪免费永久| 四虎永久免费地址在线网站| 亚洲AV无码成人网站久久精品大| 亚洲成a人不卡在线观看| 免费无码一区二区| 亚洲精品老司机在线观看| 久久亚洲精品成人| 亚洲av永久无码天堂网| 亚洲AV无码国产剧情| 国产日产成人免费视频在线观看| 久久精品亚洲综合专区| 51精品视频免费国产专区| 久久久久亚洲av成人无码电影| 亚洲AV成人噜噜无码网站| 午夜免费福利在线观看| 亚洲综合色一区二区三区小说| 国产午夜精品理论片免费观看 | 一级女性全黄久久生活片免费| 国产乱弄免费视频| 国产又黄又爽又大的免费视频| 亚洲一区二区在线免费观看| 免费国产污网站在线观看不要卡| 亚洲色精品88色婷婷七月丁香| 亚洲人成网站在线播放2019| 国产在线观看免费观看不卡| 亚洲AV无码精品色午夜在线观看| 亚洲美女免费视频| 校园亚洲春色另类小说合集| 无码日韩人妻av一区免费| 免费视频成人国产精品网站| 亚洲天堂久久精品| 最近中文字幕国语免费完整| 日韩va亚洲va欧洲va国产| 国产一级a毛一级a看免费人娇|