一旦我从Win32 DLL获得HWND,我可以获得本机窗口的坐标(即使窗口移动)

时间:2011-04-06 01:18:22

标签: java c++ java-native-interface

感谢监控此论坛的专家,这位Java程序员可以通过JNI成功获得HWND(桌面上的本机窗口句柄)。 我的目标是让这个原生窗口的窗口坐标(x,y)在屏幕共享项目上工作。在调用java程序中,即使窗口被用户移动(坐标改变......),我也需要“coordindates”。

我的问题是,这个句柄会给我一些coordindates的动态值(当窗口被移动时会改变),还是我需要继续调用本机dll来查看值是否改变了? 我希望我可以只调用本机程序“一次”,窗口句柄可以给我动态值。如果我必须继续调用本机过程,那么我不妨传递坐标(Point来自GetRect ..())而不是HWND?

2 个答案:

答案 0 :(得分:0)

您可以在JNI DLL中尝试GetWindowLong()(使用GWL_WNDPROC(-4)),这样您就可以将其他WndProc()地址重定向到您的应用程序,并拦截发送到窗口的每条消息和然后监控重要的变化。我在Win32原生C ++应用程序中完成了这项工作,但从未使用过Java。它可能有用。

oldAddress = GetWindowLong( hwnd, GWL_WNDPROC );
SetWindowLong( hwnd, GWL_WNDPROC, myWndProc );

从你的WndProc()中,使用:

CallWindowProc( oldAddress, hwnd, msg, wparam, lparam );

您可以检查IsValidWindow(hwnd)以确保窗口仍在范围内。当您的程序退出时,请务必致电:

SetWindowLong( hwnd, GWL_WNDPROC, oldAddress );

答案 1 :(得分:0)

我相信windows API GetWindowRect()正是这样做的