Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530106
  • 博文数量: 135
  • 博客积分: 3568
  • 博客等级: 中校
  • 技术积分: 1942
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-19 17:52
文章分类

全部博文(135)

文章存档

2012年(29)

2011年(41)

2010年(26)

2009年(12)

2008年(9)

2007年(12)

2006年(6)

分类: Java

2012-07-29 03:28:16




GetMsg.java

点击(此处)折叠或打开

  1. package me.test.jna;

  2. import javax.swing.JFrame;

  3. import me.test.jna.MyUser32.WindowProc;

  4. import com.sun.jna.Native;
  5. import com.sun.jna.Pointer;
  6. import com.sun.jna.platform.win32.WinDef.HWND;
  7. import com.sun.jna.platform.win32.WinDef.LPARAM;
  8. import com.sun.jna.platform.win32.WinDef.LRESULT;
  9. import com.sun.jna.platform.win32.WinDef.WPARAM;

  10. /**
  11.  * 应一位网友的请求,探究一下使用Java Swring 开发的GUI程序如何接收其他外部 程序发送过来的自定义消息。
  12.  *
  13.  * 最后的结果是:在JDK中尚未找到可以直接处理windows平台下其他程序发送的自定义消息的接口,但是如果对 Windows
  14.  * 消息机制熟悉的话,直接使用JNA来使用这些API倒是很方便。
  15.  *
  16.  * @author btpka3@163.com
  17.  *
  18.  */
  19. public class GetMsg {

  20.     public static void main(String args[]) {

  21.         // 创建并显示一个Java GUI窗口
  22.         JFrame getMsgWin = new JFrame("getmsg");
  23.         getMsgWin.setSize(400, 300);
  24.         getMsgWin.setLocationRelativeTo(null); // 居中
  25.         getMsgWin.setVisible(true);

  26.         // 获得其句柄
  27.         Pointer p = Native.getComponentPointer(getMsgWin);
  28.         HWND h = new HWND(p);
  29.         String hHexStr = Long.toHexString(Pointer.nativeValue(h.getPointer()))
  30.                 .toUpperCase();
  31.         System.out.println("Cur java GUI window handler is [" + hHexStr + "]");

  32.         // 取得 JDK 的 SWT 内部实现给该 Java GUI 窗口分配的事件处理函数的入口
  33.         MyUser32 myUser32 = MyUser32.INSTANCE;
  34.         final WindowProc thisFrameEventHander = myUser32.GetWindowLong(h,
  35.                 MyUser32.GWL_WNDPROC);

  36.         // 为自定义事件创建回调函数,并将其他消息继续转发原来的事件处理函数
  37.         WindowProc proc = new WindowProc() {

  38.             // 处理一个应用级别的消息(自定义消息)
  39.             public LRESULT callback(HWND hWnd, int uMsg, WPARAM wParam,
  40.                     LPARAM lParam) {

  41.                 // (v=vs.85).aspx#app_defined
  42.                 if (uMsg == 1280) {
  43.                     System.out.println("Custom message 1280 is received.");
  44.                     return null;
  45.                 } else {
  46.                     // 为了不影响该Java GUI 窗口,还需要把其他消息继续转发给原有的事件处理函数。
  47.                     return thisFrameEventHander.callback(hWnd, uMsg, wParam,
  48.                             lParam);
  49.                 }
  50.             }
  51.         };
  52.         myUser32.SetWindowLong(h, MyUser32.GWL_WNDPROC, proc);
  53.     }
  54. }

PostMsg.java

点击(此处)折叠或打开

  1. package me.test.jna;

  2. import java.awt.Container;
  3. import java.awt.Dimension;
  4. import java.awt.GridBagConstraints;
  5. import java.awt.GridBagLayout;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;

  8. import javax.swing.JButton;
  9. import javax.swing.JFrame;

  10. import com.sun.jna.Pointer;
  11. import com.sun.jna.platform.win32.User32;
  12. import com.sun.jna.platform.win32.WinDef.HWND;
  13. import com.sun.jna.platform.win32.WinDef.LPARAM;

  14. /**
  15.  * 该程序是用来模拟向Java GUI程序发送自定义消息的程序。
  16.  *
  17.  * @author btpka3@163.com
  18.  *
  19.  */
  20. public class PostMsg {

  21.     public static void main(String args[]) {

  22.         // 创建并显示一个Java GUI窗口
  23.         JFrame postMsgWin = new JFrame("postmsg");
  24.         postMsgWin.setSize(400, 300);
  25.         postMsgWin.setLocationRelativeTo(null); // 居中

  26.         JButton postMsgBtn = new JButton("post a app msg");
  27.         postMsgBtn.setPreferredSize(new Dimension(140, 50));
  28.         postMsgBtn.addActionListener(new ActionListener() {

  29.             // 每点击一次就向Java GUI窗口发送一个自定义的消息
  30.             public void actionPerformed(ActionEvent e) {
  31.                 User32 user32 = User32.INSTANCE;
  32.                 HWND h = user32.FindWindow(null, "getmsg");
  33.                 if (h != null) {
  34.                     String hHexStr = Long.toHexString(
  35.                             Pointer.nativeValue(h.getPointer())).toUpperCase();
  36.                     user32.PostMessage(h, 1280, null, new LPARAM(1));
  37.                     System.out.println("post to window [" + hHexStr
  38.                             + "] a app message (1280)");
  39.                 } else {
  40.                     System.out.println("the window is not found.");
  41.                 }
  42.             }
  43.         });
  44.         Container cotentPan = postMsgWin.getContentPane();
  45.         GridBagLayout layout = new GridBagLayout();
  46.         cotentPan.setLayout(layout);
  47.         GridBagConstraints c = new GridBagConstraints();
  48.         c.gridx = 1;
  49.         c.gridy = 1;
  50.         cotentPan.add(postMsgBtn, c);
  51.         postMsgWin.setVisible(true);

  52.     }
  53. }

MyUser32.java

点击(此处)折叠或打开

  1. package me.test.jna;

  2. import com.sun.jna.Native;
  3. import com.sun.jna.platform.win32.WinUser;
  4. import com.sun.jna.win32.StdCallLibrary;
  5. import com.sun.jna.win32.W32APIOptions;

  6. public interface MyUser32 extends StdCallLibrary, WinUser {
  7.     static MyUser32 INSTANCE = (MyUser32) Native.loadLibrary("user32",
  8.             MyUser32.class, W32APIOptions.DEFAULT_OPTIONS);

  9.     //public static final int WM_QUERYENDSESSION = 0x11;

  10.     public static int GWL_WNDPROC = -4;

  11.     // (v=vs.85).aspx
  12.     interface WindowProc extends StdCallCallback {
  13.         LRESULT callback(HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam);
  14.     }

  15.     // (v=vs.85).aspx
  16.     WindowProc SetWindowLong(HWND hWnd, int nIndex, WindowProc dwNewLong);

  17.     // (v=vs.85).aspx
  18.     WindowProc GetWindowLong(HWND hWnd, int nIndex);
  19. }






阅读(7592) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

ljdzxx2013-07-11 10:27:06

不行啊,getMsgWin窗体进入了消息死循环,表现为假死状态,我是jdk6,jna3.3.0