我知道如何獲得桌面的HWND:GetDesktopWindow()。如何獲取當前活動的Windows資源管理器窗口的HWND?
但我一直沒能找到一個函數,返回當前的主窗口有效的Windows Explorer的HWND。
如何以安全可靠的方式獲取當前活動的Windows資源管理器窗口的HWND?
我知道如何獲得桌面的HWND:GetDesktopWindow()。如何獲取當前活動的Windows資源管理器窗口的HWND?
但我一直沒能找到一個函數,返回當前的主窗口有效的Windows Explorer的HWND。
如何以安全可靠的方式獲取當前活動的Windows資源管理器窗口的HWND?
您可以通過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())。
&@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
那麼,如果您確定Windows資源管理器窗口當前是前景窗口,則可以使用GetForegroundWindow。否則,我認爲您必須通過所有窗口進行枚舉,直到找到最頂級的Explorer窗口。 Here's an example,我寫了如何枚舉所有窗口*。然後,根據this SO thread,您可以使用GetWindowThreadProcessId來過濾Explorer擁有的窗口。
*這是一段時間,但我認爲EnumWindows從z順序的頂部迭代到底部。
這本質上是不可靠的 - 即使您獲得了當前活動的瀏覽器窗口的HWND(假設其中有任何),也沒有什麼能夠阻止窗口在您的程序可以對HWND執行任何操作之前關閉並被銷燬。 – bdonlan 2011-06-09 20:44:08
爲什麼?無論你試圖做什麼都可能是不受支持的。 – 2011-06-09 20:45:29