利用 C/C++ 在 Windows 中书写全局钩子

因为平时时间不多, 在此只提供代码和代码内注释,如果想要深入了解,可以自行百度,这里提供一个很简单的例子用于做键盘全局钩子,当你书写完毕,就可以自己添加快捷方式来打开应用程序

#include 
#include 
#include 
#include 
#include 
#include 

#pragma comment(linker,"/subsystem:\"windows\" /entry:\"wmainCRTStartup\"")	//改变程序入口点。此时窗口被隐藏


HHOOK g_hook;			//全局键盘钩子
LPKBDLLHOOKSTRUCT kbdStruct;		//保存键盘输入事件的信息


STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;

/// 回调函数 需要加上CALLBACK
/// nCode 为Hook代码。Hook使用它来确定任务
LRESULT CALLBACK keyboardProc(int nCode, WPARAM wParam, LPARAM lParam)			//键盘处理函数
{

	if (nCode >= 0)		//当nCode大于等于0的时候.此时表现正常,可以调用CallNextHookEx返回也可以返回0
	{

		/// 需要注意 现在的扫描键码值前缀都要添加上L 也就是说之前的VK_MEAU需要变为VK_LMEAU才是现在的扫描码
		/// ALT是系统按键  扫描码值为 56  宏定义为VK_LMEAU 
		///当系统按键被按下
		kbdStruct = (LPKBDLLHOOKSTRUCT)lParam;
		if (wParam == WM_SYSKEYDOWN)
		{

			if (kbdStruct->vkCode == 0x41)		//如果按下alt+A 打开截图
			{
				TCHAR appPath[] = TEXT("C:/Users/13959/Desktop/QtWorkSpace/Sceenshot/release/Sceenshot.exe");
				CreateProcess(appPath, NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
				//	std::cout << "ALT+A" << std::endl;
			}
			

			//std::cout << std::hex<< kbdStruct->vkCode << std::endl;
		}
		//VK_SHIFT
		///当非系统按键被按下
		else if (wParam == WM_KEYDOWN)
		{
			//std::cout << std::hex<< kbdStruct->vkCode << std::endl;
		}
	}

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

void setHook()			//设置钩子监视全局键盘
{
	/// 监视全局键盘的全局钩子。 回调函数为keyboardProc, 与当前进程绑定。
	if (!(g_hook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, NULL, 0)))			//钩子程序错误时候执行
	{
		char strCode[4];
		std::stringstream strm;
		strm << GetLastError();
		strm >> strCode;
		MessageBoxA(NULL, strCode, "Error", MB_OK);
	}
}

/* 释放键盘钩子 */
void ReleaseHook()
{
	UnhookWindowsHookEx(g_hook);
}

int wmain()
{
	HANDLE hMutex;

	//设置一个互斥量,来放置程序多开,只需要一个钩子程序监测键盘即可。
	hMutex = CreateMutexA(NULL, FALSE, "GlobalKeyboard");
	if (GetLastError() == ERROR_ALREADY_EXISTS)					//单实例程序
		return 0;			

	setHook();		//设置监视全局键盘信息的钩子

	MSG * msg = nullptr;
	bool bRet;		
	while ((bRet = GetMessage(msg, NULL, 0, 0)))
	{

	}
	ReleaseHook();
	return 0;
}

需要注意的就是, 代码运行环境在 vs2015中,隐藏窗口代码可以忽略并注释, 如果想要具体知道代码的用处,请百度!因为介绍的篇幅会过长影响阅读–

你可能感兴趣的:(应用软件)