2009-09-11 121 views
6

我想從外部應用程序獲取Delphi應用程序的窗口句柄。我可以看到創建了幾個窗口(TApplication,TFrmMain和其他一些窗口),並且我知道TApplication是「控制器」,但從不可見。但是,我可以閱讀真實窗口的價值嗎?我知道它是TFrmMain(對於這個特定的應用程序),但是有可能以某種方式真正解決這個問題嗎?信息是存儲在窗口屬性中還是其他地方?謝謝!檢索Delphi窗口句柄

回答

11

不,沒有文檔記錄的方式來發現應用程序外部哪個窗口代表Application.MainForm。在Delphi的新版本中,主窗體的窗口句柄不一定是Application.MainForm.Handle;應用程序可以處理OnGetMainFormHandle事件以返回他們想要的任何內容 - 用於爲模態對話框選擇父窗口。

你可以猜想通過在他們的類名中查找帶有「main」的窗口,但是即使你找到了一個,也不能保證它只有一個實例。應用程序可以有多個頂層窗口,在這種情況下,將其中任何一個指定爲「主」窗口都沒有多大意義。

+0

謝謝,我很害怕這個。 :( – 2009-09-11 14:51:58

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函數。