窗口过程--处理点击鼠标左右键的消息(带注释)

/*当鼠标左键在窗口客户区被点击时,提示“按击来自主人的食指”,当鼠标右键在窗口客户区被点击时,提示“感受到主人中指的力度”*/
#include<windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
/*WNDCLASS 结构
Windows 的窗口总是基于窗口类来创建的,窗口类同时确定了处理窗口消息的窗口过程(回调函数)。
在创建应用程序窗口之前,必须调用 RegisterClass 函数来注册窗口类。该函数只需要一个参数,
即指向 WNDCLASS 窗口类的指针。因为 WNDCLASS 类包含了窗口所拥有的基本属性。*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT("MyWindows");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;
	wndclass.style = CS_HREDRAW | CS_VREDRAW;			//指定窗口类型,各种“类风格”,可以使用按位或操作符组合起来
	//CS_VREDRAW	移动或者调整窗口的高度(垂直方向)时,重绘整个窗口
	//CS_HREDRAW	移动或者调整窗口的宽度(水平方向)时,重绘整个窗口
	wndclass.lpfnWndProc = WndProc;						//指定窗口过程(必须是回调函数)
	wndclass.cbClsExtra = 0;							//预留的额外空间,一般为 0
	wndclass.cbWndExtra = 0;							//预留的额外空间,一般为 0
	wndclass.hInstance = hInstance;						//应用程序的实例句柄
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);	//为所有基于该窗口类的窗口设定一个图标
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);		//为所有基于该窗口类的窗口设定一个鼠标指针
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//	指定窗口背景色
	wndclass.lpszMenuName = NULL;						//指定窗口菜单
	wndclass.lpszClassName = szAppName;					//指定窗口类名
	if (!RegisterClass(&wndclass))						//RegisterClass注册窗口类
	{
		MessageBox(NULL, TEXT("这个程序需要在Windows NT 才能执行!"), szAppName, MB_ICONERROR);
		return 0;
	}
	/*CreateWindow 函数创建一个重叠式窗口、弹出式窗口或子窗口。它指定窗口类,窗口标题,窗口风格,以及窗口的
	初始位置及大小(可选的)。函数也指该窗口的父窗口或所属窗口(如果存在的话),及窗口的菜单。
	若要使用除 CreateWindow 函数支持的风格外的扩展风格,则使用 CreateWindowEx 函数代替 CreateWindow 函数。*/
	/*HWND WINAPI CreateWindow(
	_In_opt_  LPCTSTR lpClassName,    // 窗口类名称
	_In_opt_  LPCTSTR lpWindowName,   // 窗口标题
	_In_      DWORD dwStyle,          // 窗口风格,或称窗口格式
	_In_      int x,                  // 初始 x 坐标
	_In_      int y,                  // 初始 y 坐标
	_In_      int nWidth,             // 初始 x 方向尺寸
	_In_      int nHeight,            // 初始 y 方向尺寸
	_In_opt_  HWND hWndParent,        // 父窗口句柄
	_In_opt_  HMENU hMenu,            // 窗口菜单句柄
	_In_opt_  HINSTANCE hInstance,    // 程序实例句柄
	_In_opt_  LPVOID lpParam          // 创建参数
	);*/
	hwnd = CreateWindow(szAppName,	// 窗口类名称
		TEXT("酷酷的糖"),			// 窗口标题
		WS_OVERLAPPEDWINDOW,		// 窗口风格,或称窗口格式
		//WS_OVERLAPPEDWINDOW相当于(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)
		CW_USEDEFAULT,				// 初始 x 坐标
		CW_USEDEFAULT,				// 初始 y 坐标
		CW_USEDEFAULT,				// 初始 x 方向尺寸
		CW_USEDEFAULT,				// 初始 y 方向尺寸
		NULL,						// 父窗口句柄
		NULL,						// 窗口菜单句柄
		hInstance,					// 程序实例句柄
		NULL);						// 创建参数

	ShowWindow(hwnd, iCmdShow);		//显示窗口
	UpdateWindow(hwnd);				//更新窗口

	/*BOOL WINAPI GetMessage(
	_Out_     LPMSG lpMsg,
	_In_opt_  HWND hWnd,
	_In_      UINT wMsgFilterMin,
	_In_      UINT wMsgFilterMax
	);*/
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;

	switch (message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		GetClientRect(hwnd, &rect);
		DrawText(hdc, TEXT("大家好,我是xxx!"), -1, &rect,
			DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		EndPaint(hwnd, &ps);
		return 0;

	case WM_LBUTTONDOWN:
		MessageBox(NULL, TEXT("按击来自主人的食指"), TEXT("好舒服!"), MB_OK);
		return 0;
	case WM_RBUTTONDOWN:
		MessageBox(NULL, TEXT("感受到主人中指的力度"), TEXT("好舒服!"), MB_OK);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc(hwnd, message, wParam, lParam);
}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,在C#中实现鼠标自动点击需要用到Windows API的`mouse_event`函数。该函数可以模拟鼠标事件,包括鼠标移动、鼠标按下、鼠标释放等。 具体实现步骤如下: 1. 引入Windows API库 在C#中,我们可以通过DllImport属性来引入Windows API库。具体代码如下: ```csharp using System.Runtime.InteropServices; [DllImport("user32.dll")] public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo); ``` 2. 定义鼠标事件 在`mouse_event`函数中,我们需要指定鼠标事件的类型。常见的事件类型包括: - MOUSEEVENTF_LEFTDOWN:鼠标键按下 - MOUSEEVENTF_LEFTUP:鼠标键释放 - MOUSEEVENTF_RIGHTDOWN:鼠标右键按下 - MOUSEEVENTF_RIGHTUP:鼠标右键释放 根据鼠标按键的ASCLL码,我们可以判断鼠标事件的类型。具体代码如下: ```csharp const uint MOUSEEVENTF_LEFTDOWN = 0x0002; const uint MOUSEEVENTF_LEFTUP = 0x0004; const uint MOUSEEVENTF_RIGHTDOWN = 0x0008; const uint MOUSEEVENTF_RIGHTUP = 0x0010; private void PerformMouseClick(int buttonAsciiCode) { uint eventFlags = 0; switch(buttonAsciiCode) { case 1: // 鼠标键 eventFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP; break; case 2: // 鼠标右键 eventFlags = MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP; break; default: break; } if(eventFlags != 0) { mouse_event(eventFlags, 0, 0, 0, 0); } } ``` 3. 监听鼠标按键 在窗口设计中,我们可以通过`MouseDown`和`MouseUp`事件来监听鼠标按键的按下和释放。具体代码如下: ```csharp private void Form1_MouseDown(object sender, MouseEventArgs e) { if(e.Button == MouseButtons.Left) { PerformMouseClick(1); } else if(e.Button == MouseButtons.Right) { PerformMouseClick(2); } } private void Form1_MouseUp(object sender, MouseEventArgs e) { // do nothing } ``` 完整代码如下: ```csharp using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace MouseClickDemo { public partial class Form1 : Form { [DllImport("user32.dll")] public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo); const uint MOUSEEVENTF_LEFTDOWN = 0x0002; const uint MOUSEEVENTF_LEFTUP = 0x0004; const uint MOUSEEVENTF_RIGHTDOWN = 0x0008; const uint MOUSEEVENTF_RIGHTUP = 0x0010; public Form1() { InitializeComponent(); } private void PerformMouseClick(int buttonAsciiCode) { uint eventFlags = 0; switch(buttonAsciiCode) { case 1: // 鼠标键 eventFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP; break; case 2: // 鼠标右键 eventFlags = MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP; break; default: break; } if(eventFlags != 0) { mouse_event(eventFlags, 0, 0, 0, 0); } } private void Form1_MouseDown(object sender, MouseEventArgs e) { if(e.Button == MouseButtons.Left) { PerformMouseClick(1); } else if(e.Button == MouseButtons.Right) { PerformMouseClick(2); } } private void Form1_MouseUp(object sender, MouseEventArgs e) { // do nothing } } } ``` 以上就是根据鼠标按键的ASCLL码实现鼠标自动点击的详细步骤和代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值