Вы можете использовать EnumWindows для перечисления всех окон верхнего уровня в системе. Затем вам нужно отфильтровать эти окна, чтобы получить те, которые вас интересуют. Имя класса, вероятно, является лучшим выбором для фильтрации, а не имени окна. Вот пример кода (не проверенного) того, что я имею в виду:
BOOL CALLBACK BroadcastToNotepad(HWND hwnd, LPARAM lParam)
{
wchar_t lpClassName[16];
/*
* More reliable to filter by class name. We could additionally filter
* by caption name too if necessary.
*/
if(GetClassName(hwnd, lpClassName, _countof(lpClassName))) {
if(wcscmp(lpClassName, L"Notepad") == 0) {
SendMessage(hwnd, WM_KEYDOWN, (WPARAM)lParam, 0);
Sleep(1000);
SendMessage(hwnd, WM_KEYUP, (WPARAM)lParam, 0);
}
}
return TRUE;
}
// Some handler which gets invoked when your hotkey is hit.
void handlerKey1(...)
{
EnumWindows(BroadcastToNotepad, (lParam)VK_NUMPAD1)
}
Обратите внимание на использование BroadcastToNotepad и на то, как разные обработчики могут передавать разные lParam
.
И последнее, что следует отметить, это то, что PostMessage
/ SendMessage
не является надежным способом имитации ввода с клавиатуры. Это замечено Раймондом Ченом здесь . SendInput
является предпочтительным способом ввода данных. Однако, чтобы использовать это, вам нужно убедиться, что окно, в которое вы хотите отправить, имеет фокус клавиатуры.
Я смутно припоминаю, что играл с чем-то похожим на то, что вы делали в прошлом. Если я правильно помню, вам нужно отправить в дочернее окно Блокнота (имя класса = Edit
). Поэтому приведенный выше код необходимо изменить следующим образом:
if(wcscmp(lpClassName, L"Notepad") == 0) {
HWND hwndChild = FindWindowEx(hwnd, NULL, L"Edit", NULL);
SendMessage(hwndChild, WM_KEYDOWN, (WPARAM)lParam, 0);
Sleep(1000);
SendMessage(hwndChild, WM_KEYUP, (WPARAM)lParam, 0);
}