2011-04-06 89 views
0

感謝監視此論壇的專家,此Java程序員可以成功獲取HWND(句柄本地窗口在桌面上)通過JNI。 我的目標是讓本機窗口的窗口座標(x,y)在屏幕共享項目上工作。在調用java程序中,即使窗口被用戶移動(座標改變...),我也需要「coordindates」。從Win32 DLL獲得HWND後,能否獲得本地窗口的座標(即使窗口移動)

我給你的問題是,這個句柄會給我coordindates的動態值(當窗口被移動時發生改變),還是我需要繼續調用本地dll來查看值是否改變了? 我希望我可以調用本地過程「一次」,窗口句柄可以給我動態值。如果我必須繼續調用本地過程,那麼我可能會傳遞座標(從GetRect ..()開始)而不是HWND?

+0

不行,你必須調用WinAPI的每一次,看是否座標改變。而HWND是WinAPI調用的強制性參數。 – 9dan 2011-04-06 03:15:15

回答

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); 
+0

在這個問題上幾乎失去了希望,所以謝謝,讓我試試吧! @RickHodgin – RandyKahn 2011-07-30 05:54:44

0

我相信Windows的API GetWindowRect()正是這樣做的