/*++ Copyright (c) 2000 Microsoft Corporation Module Name: wnd.c Abstract: Utilities for window management Author: Jim Schmidt (jimschm) 01-Feb-2000 Revision History: --*/ // // Includes // #include "pch.h" #define DBG_WND "Wnd" // // Strings // // None // // Constants // // None // // Macros // // None // // Types // typedef struct { PCSTR WindowTitle; DWORD ProcessId; HWND Match; } FINDWINDOW_STRUCTA, *PFINDWINDOW_STRUCTA; typedef struct { PCWSTR WindowTitle; DWORD ProcessId; HWND Match; } FINDWINDOW_STRUCTW, *PFINDWINDOW_STRUCTW; // // Globals // // None // // Macro expansion list // // None // // Private function prototypes // // None // // Macro expansion definition // // None // // Code // BOOL CALLBACK pEnumWndProcA ( HWND hwnd, LPARAM lParam ) /*++ Routine Description: A callback that is called for every top level window on the system. It is used with pFindParentWindow to locate a specific window. Arguments: hwnd - Specifies the handle of the current enumerated window lParam - Specifies a pointer to a FINDWINDOW_STRUCTA variable that holds WindowTitle and ProcessId, and receives the handle if a match is found. Return Value: The handle to the matching window, or NULL if no window has the specified title and process ID. --*/ { CHAR title[MAX_MBCHAR_PATH]; DWORD processId; PFINDWINDOW_STRUCTA p; BOOL match = FALSE; p = (PFINDWINDOW_STRUCTA) lParam; if (!GetWindowThreadProcessId (hwnd, &processId)) { DEBUGMSG ((DBG_WND, "Enumerated hwnd no longer valid")); return TRUE; } if (processId == p->ProcessId) { match = TRUE; } if (p->WindowTitle) { GetWindowTextA (hwnd, title, ARRAYSIZE(title)); DEBUGMSGA (( DBG_NAUSEA, "Testing window: %s, ID=%08Xh against %s, %08Xh", title, processId, p->WindowTitle, p->ProcessId )); match = match && StringMatchA (title, p->WindowTitle); } ELSE_DEBUGMSGA (( DBG_NAUSEA, "Testing window: Process ID=%08Xh against %08Xh", processId, p->ProcessId )); if (match) { p->Match = hwnd; #ifdef DEBUG // // Get the window title for the following debug message // GetWindowTextA (hwnd, title, ARRAYSIZE(title)); DEBUGMSGA (( DBG_NAUSEA, "Window found: %s, ID=%u", title, processId )); #endif return FALSE; // stop enum } return TRUE; // continue enum } BOOL CALLBACK pEnumWndProcW ( HWND hwnd, LPARAM lParam ) { WCHAR title[MAX_MBCHAR_PATH]; DWORD processId; PFINDWINDOW_STRUCTW p; BOOL match = FALSE; p = (PFINDWINDOW_STRUCTW) lParam; if (!GetWindowThreadProcessId (hwnd, &processId)) { DEBUGMSG ((DBG_WND, "Enumerated hwnd no longer valid")); return TRUE; } if (processId == p->ProcessId) { match = TRUE; } if (p->WindowTitle) { GetWindowTextW (hwnd, title, ARRAYSIZE(title)); DEBUGMSGW (( DBG_NAUSEA, "Testing window: %s, ID=%08Xh against %s, %08Xh", title, processId, p->WindowTitle, p->ProcessId )); match = match && StringMatchW (title, p->WindowTitle); } ELSE_DEBUGMSGW (( DBG_NAUSEA, "Testing window: Process ID=%08Xh against %08Xh", processId, p->ProcessId )); if (match) { p->Match = hwnd; #ifdef DEBUG // // Get the window title for the following debug message // GetWindowTextW (hwnd, title, ARRAYSIZE(title)); DEBUGMSGA (( DBG_NAUSEA, "Window found: %s, ID=%u", title, processId )); #endif return FALSE; // stop enum } return TRUE; // continue enum } HWND FindWindowInProcessA ( IN DWORD ProcessId, IN PCSTR WindowTitle OPTIONAL ) /*++ Routine Description: Finds a window by enumerating all top-level windows, and checking the process id. The first one to match the optionally supplied title is used. Arguments: ProcessId - Specifies the ID of the process who owns the window. If zero is specified, NULL is returned. WindowTitle - Specifies the name of the window to find. Return Value: The handle to the matching window, or NULL if no window has the specified title and process ID. --*/ { FINDWINDOW_STRUCTA findWndStruct; // // If no process ID, we cannot have a match // if (!ProcessId) { DEBUGMSG ((DBG_WND, "ProcessId == 0")); return NULL; } ZeroMemory (&findWndStruct, sizeof (findWndStruct)); findWndStruct.WindowTitle = WindowTitle; findWndStruct.ProcessId = ProcessId; EnumWindows (pEnumWndProcA, (LPARAM) &findWndStruct); return findWndStruct.Match; } HWND FindWindowInProcessW ( IN DWORD ProcessId, IN PCWSTR WindowTitle OPTIONAL ) { FINDWINDOW_STRUCTW findWndStruct; // // If no process ID, we cannot have a match // if (!ProcessId) { DEBUGMSG ((DBG_WND, "ProcessId == 0")); return NULL; } ZeroMemory (&findWndStruct, sizeof (findWndStruct)); findWndStruct.WindowTitle = WindowTitle; findWndStruct.ProcessId = ProcessId; EnumWindows (pEnumWndProcW, (LPARAM) &findWndStruct); return findWndStruct.Match; }