JNative实现windows消息通讯

创建窗口句柄:

 HWND hwnd = new HWND(User32.CreateWindowEx(0, "Button", "TATA",
                 WindowsConstants.WS_OVERLAPPEDWINDOW, 20, 30, 200, 300, 0, 0,
                 JNative.getCurrentModule(), 0));

打开第三方软件:

SHELLEXECUTEINFO execInfo = new SHELLEXECUTEINFO();

//以\0 结尾的字符串,指出 lpVerb 的操作对象的路径
execInfo.lpFile = "WX.exe";
//可选。指明工作目录的名字,成员没有说明,则默认为当前目录
execInfo.lpDirectory = "D:\\wx\\";
//必须。指定打开的程序的显示方式,为SW_值中的一个。
execInfo.nShow = WindowsConstants.SW_SHOWNORMAL;
//指定执行的动作,包括:edit ,explore ,find ,open,print, properties
execInfo.lpVerb = "open";
//可选。执行ShellExecuteEx的窗口句柄,可设为NULL。
execInfo.hwnd = hwnd;     
//可选。运行/打开程序的参数,如果打开的是一个文档,则该项无效。这里将java窗口句柄值传给第三方,
//来实现两者之间的通信。
execInfo.lpParameters = hwnd.getValueAsString();

Shell32.ShellExecuteEx(execInfo);   //对指定应用程序执行某个操作

注册窗口消息处理程序,处理hwnd窗口句柄接收的消息:

JNative.registerWindowProc(hwnd, new WindowProc() {
      /**
      *hwnd:指向窗口的句柄。
      *uMsg:指定消息类型。
      *wParam:指定其余的、消息特定的信息。该参数的内容与UMsg参数值有关。
      *IParam:指定其余的、消息特定的信息。该参数的内容与uMsg参数值有关。
      **/
      public int windowProc(int hwnd, int uMsg, int wParam, int lParam) {
           System.err.println(hwnd + " " + uMsg + " " + wParam + lParam);                
           return 0;
      }
});

接收hwnd接收到的消息:

MSG msg = new MSG();
while (true) {
    //获取窗口的消息。
    //lpMsg是从线程消息队列里获取到的消息指针。
    //hWnd是想获取那个窗口的消息,当设置为NULL时是获取所有窗口的消息。
    //wMsgFilterMin是获取消息的ID编号最小值,如果小于这个值就不获取回来
    //wMsgFilterMax是获取消息的ID编号最大值,如果大于这个值就不获取回来。
    User32.GetMessage(msg, hwnd, 0, 0); 
    
    //该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数
    //GetMessage或PeekMessage时被读出。
    User32.TranslateMessage(msg);
    
    //该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得。消息被分发到回调函数(过程函数),
    //作用是消息传递给操作系统,然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数中处理消息。
    //也就是分发给上面注册的hwnd
     User32.DispatchMessage(msg);
}

接收消息处理完毕,给第三方发送消息就简单了:

User32.PostMessage(getWxHWND(), new UINT(1),  new WPARAM(0), new LPARAM(1));

你可能感兴趣的:(JNative实现windows消息通讯)