如何獲取某個程序的主視窗以及建立程序的程式名?
編譯/northtibet
在編寫工具程式以及系統管理程式的時候。常常需要獲取某個程序的主視窗以及建立此程序的程式名。獲取主視窗的目的是向視窗傳送各種訊息。獲取啟動程序的程式名可以控制對程序的操作。但是有些程序往往有多個主視窗。你要的是哪乙個主視窗呢?如果你用過outlook程式,你就會發現它有多個主視窗,乙個視窗列出收件箱和其它資料夾。如果你開啟e-mail,便會有另外乙個視窗顯示資訊。它們都是沒有父視窗(或者說宿主視窗)的主視窗。執行一下spy程式,你甚至會發現它們的視窗類名都相同:rctrl_renwnd32。資源管理器(explorer.exe)也有不止乙個主視窗。如圖一所示,資源管理器有兩個主視窗。一般來講,想要獲取主視窗,憑視窗的式樣或類名,你沒有什麼辦法知道哪乙個視窗是真正意義上的主視窗。
首先我們討論如何從多個視窗中獲取主視窗?其實很容易。利用兩個api函式便可以實現。這兩個api是 enumwindows 和 getwindowthreadprocessid。如果你對這兩個函式不熟悉,不要怕,本文提供了乙個c++類來對這兩個api進行封裝。這個類叫 cmainwindowiterator,用它可以列舉某個程序(已知程序id)的所有主視窗。這正是我們想要的東西。其使用方法如下:
dword pid = // 已知某個程序的id就這麼簡單,cmainwindowiterator派生於乙個更通用的類:cwindowiterator,cwindowiterator負責將::enumwindows函式打包以隱藏**細節。它有乙個虛函式onwindow,你可以在派生類中重寫這個函式,從而可以用任何方式來列舉視窗。cmainwindowiterator就是重寫了onwindow函式,讓它只獲取屬於某個給定程序的主視窗:cmainwindowiterator itw(pid);
for (hwnd hwnd = itw.first(); hwnd; hwnd=itw.next())
// (在建構函式中設定m_pid)這兩個類的定義如下:(對應的檔案是 enumproc.h 和 enumproc.cpp)//bool cmainwindowiterator::onwindow(hwnd hwnd)
return false;
}
// 這個類主要是封裝::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...