如何獲取某個程序的主視窗以及建立程序的程式名?

2021-04-28 19:49:45 字數 1378 閱讀 9929

如何獲取某個程序的主視窗以及建立程序的程式名?

編譯/northtibet

在編寫工具程式以及系統管理程式的時候。常常需要獲取某個程序的主視窗以及建立此程序的程式名。獲取主視窗的目的是向視窗傳送各種訊息。獲取啟動程序的程式名可以控制對程序的操作。但是有些程序往往有多個主視窗。你要的是哪乙個主視窗呢?如果你用過outlook程式,你就會發現它有多個主視窗,乙個視窗列出收件箱和其它資料夾。如果你開啟e-mail,便會有另外乙個視窗顯示資訊。它們都是沒有父視窗(或者說宿主視窗)的主視窗。執行一下spy程式,你甚至會發現它們的視窗類名都相同:rctrl_renwnd32。資源管理器(explorer.exe)也有不止乙個主視窗。如圖一所示,資源管理器有兩個主視窗。一般來講,想要獲取主視窗,憑視窗的式樣或類名,你沒有什麼辦法知道哪乙個視窗是真正意義上的主視窗。

首先我們討論如何從多個視窗中獲取主視窗?其實很容易。利用兩個api函式便可以實現。這兩個api是 enumwindows 和 getwindowthreadprocessid。如果你對這兩個函式不熟悉,不要怕,本文提供了乙個c++類來對這兩個api進行封裝。這個類叫 cmainwindowiterator,用它可以列舉某個程序(已知程序id)的所有主視窗。這正是我們想要的東西。其使用方法如下:

dword pid = // 已知某個程序的id

cmainwindowiterator itw(pid);

for (hwnd hwnd = itw.first(); hwnd; hwnd=itw.next())

就這麼簡單,cmainwindowiterator派生於乙個更通用的類:cwindowiterator,cwindowiterator負責將::enumwindows函式打包以隱藏**細節。它有乙個虛函式onwindow,你可以在派生類中重寫這個函式,從而可以用任何方式來列舉視窗。cmainwindowiterator就是重寫了onwindow函式,讓它只獲取屬於某個給定程序的主視窗:
// (在建構函式中設定m_pid)

bool cmainwindowiterator::onwindow(hwnd hwnd)

return false;

}

這兩個類的定義如下:(對應的檔案是 enumproc.h 和 enumproc.cpp)//

// 這個類主要是封裝::enumwindows,列舉頂層視窗

//class cwindowiterator

public:

cwindowiterator(dword nalloc=1024);

~cwindowiterator();

dword getcount()

hwnd first();

hwnd next() {

return m_hwnds && m_current

如何根據程序id獲取該程序的主視窗控制代碼

最近剛好有個功能,需要這個邏輯,話不多說,上 struct handle data bool ismainwindow hwnd handle hwnd findmainwindow unsigned long process id bool callback enumwindowscallback...

C 遍歷程序獲取主視窗控制代碼

當我們啟動乙個程式,用 process process process.start path path是程式的絕對路徑 啟動時,獲取的process.handle其實是程序的控制代碼,並不是視窗的控制代碼,而有時process.mainwindowhandle卻等於0 此時就需要用列舉來獲取啟動程序...

C 獲取程序的主視窗控制代碼的實現方法

通過呼叫win32 api實現。複製 如下 public class user32api dllimport user32.dll entrypoint en setlasterror true public static extern bool enumwindows wndenumproc lp...