2015-03-29 3 views
3

Я пытаюсь обновить старое приложение для работы в 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 вызывает зависание, и я попытался переместить его в другой поток, но все еще получил зависание.

Я что-то не так? Благодаря

+0

Я вижу то же самое. Вы когда-нибудь это понимаете? –

+0

@ Дрю Делано, приятно видеть, что я не сумасшедший, но, к сожалению, я никогда не находил, что вызывало проблему. – subb

ответ

0

JournalRecordProc callback function:

Приложения, которое установило процедуру крючка JournalRecordProc должны следить за виртуальный код ключа в VK_CANCEL (который реализуется как CTRL + BREAK комбинации клавиша на большинстве клавиатур) , Этот код виртуального ключа должен интерпретироваться приложением как сигнал, который пользователь хочет остановить запись журнала. Приложение должно ответить, завершая последовательность записи и удаляя процедуру крюка JournalRecordProc. Удаление важно. Это препятствует тому, чтобы приложение для журналирования блокировало систему, повесив внутри процедуры крючка.

+0

Да, но я не нажимаю ctrl-break. Кажется, он висит до того, как вызывается мой крюк, а внутри функции SetWindowsHookEx. – subb