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

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

#include <Windows.h>
#include <WinUser.h>
#include <iostream>
#include <sstream>
#include <process.h>
#include <fstream>

#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中,隐藏窗口代码可以忽略并注释, 如果想要具体知道代码的用处,请百度!因为介绍的篇幅会过长影响阅读–

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

David_TD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值