再会,
我一直在使用 JNA 与 Windows API 交互,现在我在创建窗口时卡住了。就我所做的如下: 1. 已经创建了现有窗口的子窗口并获得了一个有效的处理程序。2. 了解 Windows 中的每个窗口都有一个不间断的消息分发循环。3. 了解将我的窗口包含在消息调度循环中的最佳方法是使用类似以下代码的代码(不是我的,但我也会这样做):
final LONG_PTR prevWndProc = new LONG_PTR(User32.INSTANCE.GetWindowLong(hwnd, User32.GWL_WNDPROC)); //this is to obtain a pointer to the WNDPROC of the parent window, which we are going to need later
wndProcCallbackListener = new WndProcCallbackListener()
{
public LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam)
{
if (uMsg == WTSAPI.WM_POWERBROADCAST)
{
System.out.println("WM_POWERBROADCAST Event: hWnd="+hwnd+", uMsg="+uMsg+", uParam="+uParam+", lParam="+lParam);
}
else if (uMsg == WTSAPI.WTS_SESSION_CHANGE)
{
System.out.println("WTS_SESSION_CHANGE Event: hWnd="+hwnd+", uMsg="+uMsg+", uParam="+uParam+", lParam="+lParam);
}
//Call the window's actual WndProc so the events get processed.
return User32.INSTANCE.CallWindowProc(prevWndProc, hWnd, uMsg, uParam, lParam);
}
};
//Set the WndProc function to use our callback listener instead of the window's one.
int result = User32.INSTANCE.SetWindowLong(hwnd, User32.GWL_WNDPROC, wndProcCallbackListener);
但是,我的问题是,当我为父窗口(我的第一行代码)调用 GetWindowLong() 时,我得到的指针为 0,表示函数未成功完成。随后调用 GetLastError() 并快速检查错误代码会给我一个“拒绝访问”错误。这当然是合乎逻辑的,因为我试图从我自己的线程访问另一个 WNDPROC 的地址,但我想知道是否有任何方法(当然应该有)来规避它。
任何指针?(双关语)