创建窗口句柄:
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));