2013-05-05 2 views
2

Я пытаюсь поймать событие заставки. Это мой код:Захват события заставки

#include "stdafx.h" 
#include <iostream> 
#include "stdio.h" 

#include <Windows.h> 


HHOOK _hook; 

LRESULT CALLBACK HookCallback(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode >= 0) 
    { 


     LPMSG msg = (LPMSG)lParam; 

     if(msg->message == WM_SYSCOMMAND) 
     { 
      if (msg->wParam == SC_SCREENSAVE) 
      { 
       std::cout<<"SC_SCREENSAVE\n"; 
      } 
     } 

    } 

    return CallNextHookEx(_hook, nCode, wParam, lParam); 
} 

void SetHook() 
{ 

    if (!(_hook = SetWindowsHookEx(WH_GETMESSAGE, HookCallback,NULL , 0))) 
    { 
     std::cout<<"Failed to install hook!\n"; 
    } 
} 

void ReleaseHook() 
{ 
    UnhookWindowsHookEx(_hook); 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    SetHook(); 

    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 

    } 

    ReleaseHook(); 

    return 0; 
} 

Функция SetWindowsHookEx(WH_GETMESSAGE, HookCallback,NULL , 0) не работает. Она возвращает код:

Ошибка 1428: Не удается установить нелокальный обработчик без дескриптора модуля

.Что я делаю неправильно? Спасибо!

+1

Не имеет ли Windows функция GetLastError (или что-то в этом роде), чтобы узнать больше о том, почему предыдущий вызов API не удался? Вы попробовали это? – Mat

+0

@Mat - я попробую ... – Sanich

+0

Это похоже только на половину цикла сообщений. – Benj

ответ

0

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

Возможно вас заинтересует this вопрос/ответ.