Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2011, 22:20   #1
CodeNOT
Форумчанин
 
Аватар для CodeNOT
 
Регистрация: 08.11.2010
Сообщений: 593
По умолчанию Хук клавиатуры

Еще раз здравствуйте.
Не могу разобраться с перехватом нажатия клавиш глобально, т.е. во всех активных приложениях.
В принципе нашел исходник, но он 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);
}
CodeNOT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хук клавиатуры для Unix/Linux grotesk Помощь студентам 2 16.05.2011 12:58
Глобальный хук клавиатуры. Horus92 Win Api 2 14.10.2010 22:51
Хук на изменение раскладки клавиатуры Gerzs Win Api 1 03.07.2010 22:30
Хук клавиатуры ( C# ) Disa49 Помощь студентам 1 02.05.2010 01:36
принадлежит ли число, введённое с клавиатуры отрезку (а;в). Границы отрезка вводятся с клавиатуры Maria, Russia Помощь студентам 3 17.02.2009 22:01