2011-06-09 95 views
1

我知道如何獲得桌面的HWND:GetDesktopWindow()如何獲取當前活動的Windows資源管理器窗口的HWND?

但我一直沒能找到一個函數,返回當前的主窗口有效的Windows Explorer的HWND。

如何以安全可靠的方式獲取當前活動的Windows資源管理器窗口的HWND?

+1

這本質上是不可靠的 - 即使您獲得了當前活動的瀏覽器窗口的HWND(假設其中有任何),也沒有什麼能夠阻止窗口在您的程序可以對HWND執行任何操作之前關閉並被銷燬。 – bdonlan 2011-06-09 20:44:08

+0

爲什麼?無論你試圖做什麼都可能是不受支持的。 – 2011-06-09 20:45:29

回答

7

您可以通過GetForegroundWindow()獲取當前活動窗口。然後,您可以執行GetWindowThreadProcessId()以獲得一個PID,然後您可以使用OpenProcess()(您需要PROCESS_QUERY_INFORMATION和PROCESS_VM_READ訪問權限)將其轉換爲進程句柄,然後您可以使用GetModuleFileNameEx()檢查進程名稱。不記得以後用CloseHandle()關閉了進程句柄。

這是我剛剛在記事本中寫的一些代碼。你可能會沿着這些路線做些事情。

DWORD lpFileName[MAX_PATH] = {0}; 
DWORD dwPID; 
HANDLE hProcess; 
HWND hwnd = GetForegroundWindow(); 
GetWindowThreadProcessId(hwnd, &dwPID); 
hProcess = OpenProcess(PROCESS_QUERY_INFOMRATION | PROCESS_VM_READ, false, dwPID); 
GetModuleFileNameEx(hProcess, NULL, lpFileName, _countof(lpFileName)); 
PathStripPath(lpFileName); 

if(_tcscmp(_T("explorer.exe"), lpFileName) == 0) { 
    _tprintf(_T("explorer window found")); 
} else { 
    _tprintf(_T("foreground window was not explorer window")); 
} 
CloseHandle(hProcess); 

爲了讓你可以使用EnumWindows()您提供接收所有頂層窗口的回調所有打開的IE窗口。然後,你可以過濾出你想要的,也許可以通過過程名稱(上面),也可以按類名稱(GetClassName())。

+0

&@Nick - 感謝您提供優質的教育解答。既然你看起來很有知識,也許你也對這個問題有了一個想法呢? http://stackoverflow.com/questions/6270539/how-to-shell-notifyicon-without-adding-an-icon-in-the-notification-area :) – WinWin 2011-06-09 21:56:27

2

那麼,如果您確定Windows資源管理器窗口當前是前景窗口,則可以使用GetForegroundWindow。否則,我認爲您必須通過所有窗口進行枚舉,直到找到最頂級的Explorer窗口。 Here's an example,我寫了如何枚舉所有窗口*。然後,根據this SO thread,您可以使用GetWindowThreadProcessId來過濾Explorer擁有的窗口。

*這是一段時間,但我認爲EnumWindows從z順序的頂部迭代到底部。

相關問題