Viewing file: c/keyhook/keyhook.cpp | Back to directory listing
Author: Loren Segal | Last modified: February 20 2006 07:00 pm | Download

#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <winable.h>
#include <limits.h>
 
#define WM_MCOMMAND	(WM_USER+200)
#define WM_MEVALUATE	(WM_USER+201)
 
typedef struct {
	DWORD  mVersion;
	HWND   mHwnd;
	BOOL   mKeep;
} LOADINFO;
 
HHOOK wHook;
HWND mWindow;
 
BOOL SendCommand(HWND hwnd, char *command)
{
	HANDLE hMapFile;
	LPSTR mData;
	BOOL result = FALSE;
 
	hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 4096, "mIRC");
	mData = (LPSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
	wsprintf(mData, command);
	SendMessage(hwnd, WM_MCOMMAND, NULL, NULL);
	if (strcmp(mData, "1") == 0) result = TRUE;
	UnmapViewOfFile(mData);
	CloseHandle(hMapFile);
	return result;
}
 
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
	char msg[256] = {0}, wmkey[20] = {0};
	KBDLLHOOKSTRUCT *k;
	k = (KBDLLHOOKSTRUCT *)lParam;
	switch (wParam)
	{
		case WM_KEYUP:
			strcpy(wmkey, "WM_KEYUP");
			break;
		case WM_KEYDOWN:
			strcpy(wmkey, "WM_KEYDOWN");
			break;
		case WM_SYSKEYUP:
			strcpy(wmkey, "WM_SYSKEYUP");
			break;
		case WM_SYSKEYDOWN:
			strcpy(wmkey, "WM_SYSKEYDOWN");
			break;
		default:
			break;
	}
	wsprintf(msg, "/.signal %s %d %d", wmkey, k->vkCode, k->flags);
	SendCommand(mWindow, msg);
	return CallNextHookEx(wHook, code, wParam, lParam);
}
 
int __declspec(dllexport) __stdcall StartKeyHook(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)
{
	mWindow = mWnd;
	wHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, (HINSTANCE)GetWindowLong(mWnd, GWL_HINSTANCE), NULL);
	return 1;
}
 
int __declspec(dllexport) __stdcall GetPixelColor(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)
{
	POINT p;
	HRGN rgn;
	GetWindowRgn(GetDesktopWindow(), rgn);
	HDC hdc = GetDCEx(GetDesktopWindow(), rgn, DCX_WINDOW);
	GetCursorPos(&p);
	COLORREF color = GetPixel(hdc, p.x, p.y);
	wsprintf(data, "%d %d %d", GetRValue(color), GetGValue(color), GetBValue(color));
	return 3;
}
 
void __declspec(dllexport) __stdcall LoadDll(LOADINFO *t)
{
 
}
 
int __declspec(dllexport) __stdcall UnloadDll(int mTimeout)
{
	if (mTimeout == 0)
	{
		UnhookWindowsHookEx(wHook);
		return 1;
	}
	else
	{
		return 0;
	}
}