2010-07-08 4 views
0

J'ai un programme qui définit un crochet du clavier global et poignées de touches. Ceci est mon WinMain:manière simple et efficace pour bloquer un programme

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow) 
{ 
    MSG msg; 
    logFile = fopen("C:\\keylog.txt", "w"); 
    hKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyEvent, GetModuleHandle(NULL), 0); 

    GetMessage(&msg, NULL, 0, 0); 

    UnhookWindowsHookEx(hKeyHook); 
    fclose(logFile); 
    return 0; 
} 

Comme il ne crée pas de fenêtres, il ne recevra pas jamais un message de fenêtre, donc GetMessage bloquerait le programme, et il est très léger sur les cycles de CPU. Cependant, quand il détecte qu'une certaine touche est pressée, je veux qu'elle quitte le programme. Je ne peux pas diffuser de message parce qu'il ne le recevra pas. Si je fais quelque chose comme:

while(State == true) 
    Sleep(500); 

Le programme lui-même et le crochet global seraient caler et ce n'est pas souhaitable. Le fait de faire dormir (0) le fait consommer une quantité ingérable de cycles de processeur.

Alors, quelle est la meilleure solution pour mon problème? La seule chose que je peux penser est de passer par la peine d'enregistrer mon propre cours de fenêtre et de créer une fenêtre pour recevoir le message, mais peut-être qu'il existe un meilleur moyen?

+0

vous pouvez toujours mettre en veille (10). Ce qui est infiniment mieux que pas de sommeil, ou de sommeil (0), mais il est très réactif. – Toad

+0

Ce sera probablement beaucoup plus facile si vous venez d'enregistrer une fenêtre. À l'avenir, si vous décidez d'étendre la fonctionnalité, les choses pourraient devenir compliquées avec la communication inter-processus. –

Répondre

3

Vous ne pouvez pas diffuser un message en utilisant HWND_BROADCAST.

Vous n'avez pas besoin d'une fenêtre pour recevoir des messages. Cependant, si vous aviez un moyen de publier votre identifiant de thread, alors PostThreadMessage() pourrait être utilisé pour envoyer un message (probablement un WM_QUIT) à votre application.

+0

GetCurrentThreadId() fonctionne pour obtenir l'ID de thread. – kaykun

+0

Attendez .. Quoi? Vous n'avez pas besoin d'une file d'attente de messages pour exister dans le thread de réception pour recevoir des messages? Pourquoi une application de console aurait-elle une file d'attente de messages? –

+0

1. oui. 2. ce ne serait pas normalement. Mais peu importe. Une file d'attente de messages est créée à la demande dès qu'une API de file d'attente de messages est appelée: GetMessage() par exemple s'assurera qu'une file d'attente de messages est associée au thread. –

4

Pourquoi ne pas créer objet de synchronisation (peut-être l'événement) et remplacer GetMessage avec WaitForSingleObject? Vous pouvez facilement faire en sorte que votre routine d'accrochage au clavier déclenche l'objet et votre application effectuera les tâches de pré-terminaison.

+0

Ne fonctionne pas; par MSDN, crochets de clavier LL exécutent sur le thread qui l'installent et nécessitent une boucle de message; toute fonction Wait ... (sauf MsgWait) bloquera sans traiter les messages accrochés. – BrendanMcK

Questions connexes