为了账号安全,请及时绑定邮箱和手机立即绑定

您好,关于C# sendmessage的详解,求助!

您好,关于C# sendmessage的详解,求助!

C C#
慕侠2389804 2021-11-11 11:07:56
sendmessage有几个参数 用来发键盘消息 鼠标消息,我现在不太明白的有这些虚拟键值、按下松开、怎么区分是键盘还是鼠标、数字跟字母按键是不是不仅仅是键值的差别 还是有其他参数的区别,暂且抛开组合键, 实际点说是帮我搞定几个发送数字键,发送字母键,发送左键,右键,当然这个都包括按下和松开,另外///模拟鼠标左键点击 x表示横坐标,y表示纵坐标public void SendMsg(IntPtr hWnd, int x, int y){///发送左键消息SendMessage(hWnd, 0x0201, (IntPtr)1, (IntPtr)(y * 65536 + x));Thread.Sleep(50);SendMessage(hWnd, 0x0202, (IntPtr)1, (IntPtr)(y * 65536 + x));}这段代码是否有误?
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

先看SendMessage
SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
第一个参数HWND hWnd
故名思议是窗体句柄,你这儿作为参数传递进来了
第二个参数UINT Msg
是windows消息常量,这里使用到两个0x201,0x202,还是百科就可以找到,如下:
WM_LBUTTONDOWN = $0201;//按下鼠标左键
WM_LBUTTONUP = $0202;//释放鼠标左键
第三个参数WPARAM wParam
MSDN里头有这么一段
WM_LBUTTONDOWN
WPARAM wParam
LPARAM lParam;
Parameters
wParam
Indicates whether various virtual keys are down. This parameter can be one or more of the following values.
MK_CONTROL
The CTRL key is down.
MK_LBUTTON
The left mouse button is down.//这句是重点了,而后我查找MK_LBUTTON的值,就是定义为 0x01.也就是为什么是(IntPtr)1。
第四个参数LPARAM IParam
MSDN里说到
lParam
The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
这里说到低位代表X坐标,指向左上角,高位则代表Y坐标。从代码中的(IntPtr)(y * 65536 + x)参数不难分析到,y * 65536相当于<<16。65536代表16位数据的数据量,这个是属于位的运算。比如0-65535是个16位unsigned int类型的数据范围,一共能取到的数就是65536.这个数据是个32位的数据,前16位代表了X坐标值,后16位为Y值,所以按照这个写法应该是正确的。




查看完整回答
反对 回复 2021-11-14
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

SendMessage 第二个参数,指定发送的消息类型, 如鼠标消息WM_LBUTTONDOWN,WM_MOUSEMOVE等。键盘消息:WM_KEYDOWN,WM_KEYUP
没问题,最后2个参数也不必转成句柄。

查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 456 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信