Еще раз здравствуйте.
Не могу разобраться с перехватом нажатия клавиш глобально, т.е. во всех активных приложениях.
В принципе нашел исходник, но он 1: не компилится 2:я не понимаю как он работает
Может мне кто объяснить смысл работы данной программы:
Код:
#include <windows.h>
#pragma hdrstop
//////////////////////////////////////////////////////////////////////////
// Глобальные переменные //
//////////////////////////////////////////////////////////////////////////
#define MYWM_NOTIFY (WM_APP+100)
#define IDC_MYICON 1006
HINSTANCE hinst; // Описатель экземпляра приложения
NOTIFYICONDATA NotIconD; // Для значка в Tray
HWND MainWnd; // Окно
HINSTANCE hLib; // Библиотека с ловушками
HHOOK hKeybHook; // Ловушки
HHOOK hMouseHook;
LRESULT CALLBACK (__stdcall *pKeybHook)(int,WPARAM,LPARAM);
LRESULT CALLBACK (__stdcall *pMouseHook)(int,WPARAM,LPARAM);
//---------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
InitApplication(HINSTANCE,int); // Прототипы
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
void vfSetTrayIcon(HINSTANCE);
void vfResetTrayIcon();
//////////////////////////////////////////////////////////////////////////
// Функции //
//////////////////////////////////////////////////////////////////////////
#pragma argsused
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
//----------------
hLib=LoadLibrary("SSHook.dll");
if(hLib)
{
(void*)pKeybHook=GetProcAddress(hLib,"KeyboardHook");
hKeybHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)(pKeybHook),
hLib,0); // Ставим ловушки
(void*)pMouseHook=GetProcAddress(hLib,"MouseHook");
hMouseHook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)(pMouseHook),
hLib,0);
//----------------
if (InitApplication(hInstance,nCmdShow))
{
vfSetTrayIcon(hInstance); // Создаём окна
while (GetMessage(&msg,(HWND)(NULL),0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//----------------
UnhookWindowsHookEx(hKeybHook);
UnhookWindowsHookEx(hMouseHook); // Завершаем
FreeLibrary(hLib);
vfResetTrayIcon();
return 0;
}
}
return 1;
}
//---------------------------------------------------------------------------
BOOL InitApplication(HINSTANCE hinstance,int nCmdShow)
{ // Создание главного окна
WNDCLASS wcx; // Класс окна
wcx.style=NULL;
wcx.lpfnWndProc=MainWndProc;
wcx.cbClsExtra=0;
wcx.cbWndExtra=0;
wcx.hInstance=hinstance;
wcx.hIcon=LoadIcon(hinstance,"MAINICON");
wcx.hCursor=LoadCursor(NULL,IDC_ARROW);
wcx.hbrBackground=(HBRUSH)(COLOR_APPWORKSPACE);
wcx.lpszMenuName=NULL;
wcx.lpszClassName="HookWndClass";
if(RegisterClass(&wcx)) // Создаём окно
{
MainWnd=CreateWindow("HookWndClass","SSHook",
WS_OVERLAPPEDWINDOW/*|WS_VISIBLE*/,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,NULL,NULL,hinstance,NULL);
if(!MainWnd)
return FALSE;
return TRUE;
}
return false;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,
LPARAM lParam)
{ // Оконная процедура
switch (uMsg)
{
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
//------------
case MYWM_NOTIFY:
{
if(lParam==WM_RBUTTONUP) // Правый щелчок на значке - завершаем
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
//---------------------------------------------------------------------------
void vfSetTrayIcon(HINSTANCE hInst)
{ // Значок в Tray
char* pszTip="Хранитель экрана и раскладка";
NotIconD.cbSize=sizeof(NOTIFYICONDATA);
NotIconD.hWnd=MainWnd;
NotIconD.uID=IDC_MYICON;
NotIconD.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
NotIconD.uCallbackMessage=MYWM_NOTIFY;
NotIconD.hIcon=LoadIcon(hInst,"MAINICON");
lstrcpyn(NotIconD.szTip,pszTip,sizeof(NotIconD.szTip));
Shell_NotifyIcon(NIM_ADD,&NotIconD);
}
//---------------------------------------------------------------------------
void vfResetTrayIcon()
{ // Удаляем значок
Shell_NotifyIcon(NIM_DELETE,&NotIconD);
}