C++ 勾子案例

测试需要,仅供学习使用。

测试环境:Win10+VS2019

勾子在dll内:GlobalHook.dll

GlobalHook.h

#ifndef __GLOBAL_HOOK_H__
#define	__GLOBAL_HOOK_H__

#include<windows.h>
#include<stdio.h>

//勾子消息回调事件
typedef void(_stdcall* HookCallBack)(int code, WPARAM wParam, LPARAM lParam);
#define CINTERFACEAPI extern "C" __declspec(dllexport) 

CINTERFACEAPI void UnHook();
CINTERFACEAPI void SetHook();
CINTERFACEAPI void SetHookCallBack(HookCallBack callBack);

#endif // !__GLOBAL_HOOK_H__

GlobalHook.cpp

#include "GlobalHook.h"

HookCallBack hookCallBack = nullptr;

HHOOK g_hMouse = NULL;
HHOOK g_hKeyBoard = NULL;

//鼠标与键盘钩子共用一个回调函数
LRESULT CALLBACK HookBoardProc(int code, WPARAM wParam, LPARAM lParam) {
	if (hookCallBack != nullptr)
	{
		hookCallBack(code, wParam, lParam);
	}
	//传给下一个钩子
	return CallNextHookEx(g_hKeyBoard, code, wParam, lParam);	//执行失败会返回0
	//return TRUE; //return ture说明全部屏蔽
	//return 0;//返回系统处理
}

CINTERFACEAPI void SetHook() {
	g_hMouse = SetWindowsHookEx(WH_MOUSE_LL, HookBoardProc, NULL, 0);
	g_hKeyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, HookBoardProc, NULL, 0);
}

CINTERFACEAPI void UnHook()
{
	if (hookCallBack != nullptr)
	{
		hookCallBack = nullptr;
	}
	UnhookWindowsHookEx(g_hMouse);
	UnhookWindowsHookEx(g_hKeyBoard);
}

CINTERFACEAPI void SetHookCallBack(HookCallBack callBack)
{
	hookCallBack = callBack;
}

在控制台程序中引用(动态创建隐藏窗口)

main.cpp

#include "GlobalHook.h"

HWND Hide_Hwnd;

//勾子消息回调函数
void _stdcall OnHookCallBack(int code, WPARAM wParam, LPARAM lParam)
{
	if (code == HC_ACTION)
	{
		//鼠标消息处理
		if (WM_LBUTTONDOWN == wParam || WM_RBUTTONDOWN == wParam)  
		{
			MOUSEHOOKSTRUCT* pMouse = (MOUSEHOOKSTRUCT*)lParam;
			printf("Mouse:(%d,%d)\n", pMouse->pt.x, pMouse->pt.y);
		}

		//键盘消息处理
		if (WM_KEYDOWN == wParam || WM_SYSKEYDOWN == wParam) 
		{
			KBDLLHOOKSTRUCT* pKDB = (KBDLLHOOKSTRUCT*)lParam; 
			printf("vKCode:%d\n", pKDB->vkCode);
			if (pKDB->vkCode == 27)
			{
				::PostMessage(Hide_Hwnd, WM_QUIT, 0, 0);	//关闭Hide_Hwnd所指定的消息循环,以达到关闭窗口的目的
			}
		}
	}
}


int main()
{
	HINSTANCE hInstance;
	hInstance = GetModuleHandle(NULL);	//获取一个应用程序或动态链接库的模块句柄
	WNDCLASS Hide_WND;
	LPCWSTR windowstitle = L"HideWindow";
	Hide_WND.cbClsExtra = 0;
	Hide_WND.cbWndExtra = 0;
	Hide_WND.hCursor = LoadCursor(hInstance, IDC_ARROW);	//鼠标风格
	Hide_WND.hIcon = LoadIcon(hInstance, IDI_APPLICATION);	//图标风格
	Hide_WND.lpszMenuName = NULL;	//菜单名
	Hide_WND.style = CS_HREDRAW | CS_VREDRAW;	//窗口的风格
	Hide_WND.hbrBackground = (HBRUSH)COLOR_WINDOW;	//背景色
	Hide_WND.lpfnWndProc = DefWindowProc;//WindowProc;	//【关键】采用自定义消息处理函数,也可以用默认的DefWindowProc
	Hide_WND.lpszClassName = windowstitle;	//【关键】该窗口类的名称
	Hide_WND.hInstance = hInstance;	//【关键】表示创建该窗口的程序的运行实体代号

	RegisterClass(&Hide_WND);

	Hide_Hwnd = CreateWindow(
		windowstitle,           //【关键】上面注册的类名lpszClassName,要完全一致  
		windowstitle,  //窗口标题文字  
		WS_OVERLAPPEDWINDOW, //窗口外观样式  
		0,             //窗口相对于父级的X坐标  
		0,             //窗口相对于父级的Y坐标  
		320,                //窗口的宽度  
		240,                //窗口的高度  
		NULL,               //没有父窗口,为NULL  
		NULL,               //没有菜单,为NULL  
		hInstance,          //当前应用程序的实例句柄  
		NULL);              //没有附加数据,为NULL  

	// 显示窗口  
	//ShowWindow(hwnd, SW_SHOW);
	//隐藏窗口
	ShowWindow(Hide_Hwnd, SW_HIDE);

	// 更新窗口  
	UpdateWindow(Hide_Hwnd);

	printf("SetHook\n");
	SetHookCallBack(OnHookCallBack);
	SetHook();

	// 消息循环  
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	UnHook();
	printf("UnHook\n");

	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C Qt项目案例小游戏是一个基于C和Qt技术的简单游戏,这个游戏是由一些小游戏组合而成,包括贪吃蛇、飞机大战、弹球等。玩家可以在游戏中选择不同的游戏模式,挑战不同的难度等级。 这个小游戏使用了C和Qt技术开发,其中C语言是主要的程序语言,Qt是一个跨平台的图形用户界面框架,可以让程序在不同的操作系统上运行。 这个项目案例的开发可以帮助C和Qt初学者理解和掌握这两种技术,同时提供了一些实际的应用场景。这个小游戏的源代码也可以供初学者学习和参考。 最终,这个小游戏还可以作为一个有趣的产品,让玩家放松身心,挑战自我。总之,这个C Qt项目案例小游戏是一个好的学习工具,也是一个有趣的游戏产品,希望它能够被更多的人所关注和喜欢。 ### 回答2: c qt项目案例小游戏是一款基于c++和qt开发的经典小游戏。在游戏中,玩家需要控制一个小球跳跃,避免碰到障碍物并到达终点。游戏具有简单而优雅的界面,游戏难度逐渐增加,让玩家感到挑战和乐趣。 c qt项目案例小游戏的开发过程非常具有参考价值。首先,开发者需要使用qt的图形界面设计工具创建窗口和控件,并设置控件的属性和事件响应函数。然后,需要使用c++编写游戏逻辑和相关算法,如小球的运动轨迹、障碍物的生成和移动、碰撞检测等。最后,开发者需要将c++代码和qt界面进行连接,并打包发布为可执行文件或安装包。 c qt项目案例小游戏具有较高的可扩展性和移植性。通过添加新的元素和功能,如分数统计、背景音乐等,可以为游戏添加更多乐趣和挑战。同时,该游戏可以在多个平台上运行,如Windows、macOS、Linux等,为用户提供不同的游戏体验。 总的来说,c qt项目案例小游戏是一款典型的c++和qt应用程序开发案例,为开发者提供了一个学习和实践的平台,同时也为玩家提供了一款简单而有趣的小游戏。 ### 回答3: c qt是一种基于C++编程语言的跨平台框架,用于开发图形界面应用程序。小游戏是一种非常受欢迎的娱乐形式。结合c qt的特点,我们可以开发出非常有趣的小游戏。 c qt项目案例中的小游戏可以是各种类型,如休闲益智类、动作射击类、竞技体育类等。其中,休闲益智类小游戏比较适合初学者练习c qt编程技能。比如翻牌游戏、找茬游戏、消灭星星游戏等。 c qt项目案例中的小游戏可以采用图形化界面,使得界面美观、友好。同时,利用c qt框架的强大功能,可以实现良好的游戏效果和交互体验。开发小游戏可以锻炼编程思维能力,提高编程技能水平。 总之,c qt项目案例中的小游戏具有很高的实用价值和趣味性,可以作为初学者进行练习的项目,也能够被用于教育、科技、娱乐等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值