我想從外部應用程序獲取Delphi應用程序的窗口句柄。我可以看到創建了幾個窗口(TApplication,TFrmMain和其他一些窗口),並且我知道TApplication是「控制器」,但從不可見。但是,我可以閱讀真實窗口的價值嗎?我知道它是TFrmMain(對於這個特定的應用程序),但是有可能以某種方式真正解決這個問題嗎?信息是存儲在窗口屬性中還是其他地方?謝謝!檢索Delphi窗口句柄
6
A
回答
11
不,沒有文檔記錄的方式來發現應用程序外部哪個窗口代表Application.MainForm
。在Delphi的新版本中,主窗體的窗口句柄不一定是Application.MainForm.Handle
;應用程序可以處理OnGetMainFormHandle
事件以返回他們想要的任何內容 - 用於爲模態對話框選擇父窗口。
你可以猜想通過在他們的類名中查找帶有「main」的窗口,但是即使你找到了一個,也不能保證它只有一個實例。應用程序可以有多個頂層窗口,在這種情況下,將其中任何一個指定爲「主」窗口都沒有多大意義。
4
類名任意 Delphi窗體也是基礎「Windows窗口」的註冊窗口類名。所以,你應該能夠使用FindWindow()的Windows API調用來獲取TFrmMain的窗口句柄有點像:
hWnd := FindWindow('TFrmMain', NIL);
如果有(潛在的)給定的窗體類名稱的多個實例,那麼你或許可以通過使用第二個參數(窗口名稱,即「標題」或標題)區分它們。如果這還不夠,那麼你可能需要更復雜一點,並使用EnumWindows()函數並檢查窗口的屬性來找到感興趣的一個。
要測試arbirary窗口句柄的類名(例如,在您使用EnumWindows的()使用你的回調函數),使用GetClassName(),如:
function GetWindowClassName(const aHWND: HWND): String;
var
buf: array[0..255] of Char; // Tip: Use a more appropriately sized array
begin
GetClassName(SomeHWND, @buf, Length(buf));
result := buf;
end;
...
if SameText(GetWindowClassName(hwnd), 'TFrmMain') then
...
etc
沒有你的特定實現挑戰的具體細節很難說哪種最適合你,但希望這應該足以指引你走向正確的軌道。
1
我通常使用WinDowse來幫助我開始,但是您必須使用Deltics描述的API函數。
相關問題
- 1. 窗口句柄和窗口尺寸
- 2. 以編程方式檢索窗口句柄和按下按鈕
- 3. 獲取頂部窗口句柄(按Z索引排序窗口)
- 4. 從窗口句柄獲取窗口z索引
- 5. Python pyautogui窗口句柄
- 6. 窗口句柄C#/。NET
- 7. 窗口的主句柄
- 8. 得到窗口的句柄
- 9. 驗證Win32窗口句柄
- 10. GLUT本機窗口句柄
- 11. SendMessage函數窗口句柄
- 12. 獲取窗口句柄
- 13. MFC中的窗口句柄?
- 14. 使用WebBrowser和Delphi 2007的OLE控件窗口句柄錯誤
- 15. 如何在Delphi中獲得CWnd對象的窗口句柄?
- 16. magick.MagickException:無法檢索句柄
- 17. 檢索窗口
- 18. 獲取C#中窗口的句柄#
- 19. MoveWindow返回「無效的窗口句柄」
- 20. Getpixel()從外部窗口句柄MFC
- 21. 使用窗口句柄獲取IUKOWN
- 22. .net窗口句柄的類名
- 23. Win32Exception - 錯誤創建窗口句柄?
- 24. 獲取PyGI中的窗口句柄
- 25. 將IntPtr窗口句柄轉換爲IWin32Window^
- 26. Python Selenium獲取當前窗口句柄
- 27. 如何獲取桌面窗口句柄?
- 28. MFC面板和窗口句柄
- 29. Winforms中的窗口句柄調試
- 30. 用NSImage拖動窗口作爲句柄?
謝謝,我很害怕這個。 :( – 2009-09-11 14:51:58