Я пытаюсь обновить старое приложение для работы в Windows 7, и у меня возникают проблемы с функцией «Макросъемка», которая использует Journal Hooks. Я выполнил каждый шаг, необходимый для выполнения этой работы в Windows 7, то есть установил uiAccess = true, подписал exe и запустил его из каталога Program Files.SetWindowsHookEx (WH_JOURNALRECORD, ..) иногда зависает система
Обычно это работает, но иногда, без всякой видимой причины, кажется, что функция SetWindowsHookEx ждет чего-то и повесил всю систему странным образом: ни один вход не отправляется ни в какое приложение. Единственный способ, которым я могу избавиться от этой зависания, - это сделать ctrl-alt-del, которые вынуждают удалить крючок.
Я воспроизвел проблему с помощью простого приложения. Использование по умолчанию генерируется Win32 шаблоном Visual Studio, я изменил О диалоговом обратном вызове для регистрации и отмены регистрации крюка:
// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
{
// added this
recordHook = ::SetWindowsHookEx(WH_JOURNALRECORD, JournalRecordCallback, hInst, 0);
return (INT_PTR)TRUE;
}
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
// and this
UnhookWindowsHookEx(recordHook);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
Моей функции обратного вызова крюка просто
LRESULT CALLBACK JournalRecordCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
И, как с более крупное приложение, иногда, вызов SetWindowsHookEx зависает.
Кто-нибудь испытал это? Я думал, что, возможно, установка крюка внутри MessageLoop вызывает зависание, и я попытался переместить его в другой поток, но все еще получил зависание.
Я что-то не так? Благодаря
Я вижу то же самое. Вы когда-нибудь это понимаете? –
@ Дрю Делано, приятно видеть, что я не сумасшедший, но, к сожалению, я никогда не находил, что вызывало проблему. – subb