C# sendmessage详解,键盘 鼠标 求给力 拜托

sendmessage有几个参数用来发键盘消息鼠标消息,我现在不太明白的有这些虚拟键值、按下松开、怎么区分是键盘还是鼠标、数字跟字母按键是不是不仅仅是键值的差别还是有其他... 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));
}
这段代码是否有误?
很需要满意答案 加分
展开
 我来答
虎用95
推荐于2016-02-23 · TA获得超过431个赞
知道小有建树答主
回答量:182
采纳率:0%
帮助的人:72万
展开全部

这本身是win32API 级别的东西,你咋放在C#里面问呢?虽然是在C#里面用.NET语言,但本身这还是Win32API的东西。。。。比较底层了啊。


【疑点-1】你的代码有没有问题,要看 0x0201 和 0x0202 到底是什么:

     我不清楚键盘鼠标的事件码,你自己明白发的这2消息201和202是什么吗?



【疑点-2】后两个参数:(IntPtr)1, (IntPtr)(y * 65536 + x)

    你确定目标窗口(hWnd) 会处理这俩参数吗?而且为什么一定要转换成IntPtr的地址指针类型?


    如果目标窗口(hWnd)和你的程序不是一个主进程启动的,对方是不能访问你的内存地址的啊。。。(现在都有进程隔离)。。。


这个函数的底层(原始C)是这么定义的:

LRESULT WINAPI SendMessage(
  _In_  HWND hWnd,
  _In_  UINT Msg,
  _In_  WPARAM wParam,
  _In_  LPARAM lParam
);


如你所见,第一个参数是接收你的消息的目标窗口句柄是个数字ID,第二个参数是所要发送的消息,最后俩参数是可选的参数,一般是特殊数据才需要用的。你传过去2个地址指针,不是很明白你要干什么。。。或者 0x0201 在对方程序里是什么特殊意思吗?


【疑点-3】 对于IntPtr的使用。。。

    你确定你的程序将运行在64位的机器上吗?因为IntPtr在32位机器上运行就是32位整数,64位机器就是64位整数。。。。


    如果在32位机器上【(IntPtr)(y * 65536 + x)】 这可能就是个负数……无论是地址还是鼠标坐标应该都没有负数这么一说吧。



【疑点-4】关于 “y * 65536 + x” 的目的。。。

    我实在不能理解你这是想干什么,目测最大可能是:你想把x/y坐标系转成一个数字参数传递过去?  但你这样算出一个值z,你怎么能从结果z推导出原始的x和y呢???


    如果是屏幕坐标,一般是不超过8192的吧。。。(就算是8K分辨率),所以8192是:2的13次方。。。那么你混合坐标应该这么算: z = (y << 13 |  x );

     逆推就是: x = z & 8191 ; y = z >>> 13;


顺便一问:

你这是要做外挂么。。。

追问
那个方法是用模拟鼠标点击,是操作一些日常工作的软件,IntPtr是因定义函数用的是这个,那个什么65536是网上弄来的 我也不知道什么意思
发送数字按键,字母按键 鼠标 咋个弄?
SendMessage(hWnd, 256, (IntPtr)49, IntPtr.Zero);
SendMessage(hWnd, 257, (IntPtr)49, IntPtr.Zero);
没法发出按键呀 咋搞
追答
首先: 要确保 hWnd 是你希望操作的”日常工作软件“的主窗口句柄的ID号码 —— 这是很古老的Win32API的概念,每个桌面上的窗口(包括不可见的),甚至一个按钮,都对应一个唯一的hWnd句柄ID。。。。 如果不能获取或者获取的不对,你就趁早放弃吧。。。

其次:在现在Windows的UAC的管制之下,以及各种安全机制、沙箱隔离的现代防恶意软件的保护机制的呵护下,你要确定你的程序有系统管理员级别的权限,能够给其他”日常工作软件“的窗体发送消息才可以

最后:如其他楼层回复所述,如果是要发送键盘,那第二个参数应该是个类似于:WM_KEYDOWN 这样的值,你可以查查对应的事件数字是多少,也可以找找C#里面对应的枚举类型之类的(实在是不能帮你找了)

额外的:发送键盘(WM_KEYDOWN, WM_KEYUP)事件和发送鼠标事件(WM_MOUSEDOWN, WM_MOUSEUP)时候,最后两个参数的用途是不一样的。。。。还是你需要去看Win32API方面的知识才可以。。。。问C#是问不出个所以然的。你可以搜搜SendMessage关于发送键盘消息的用法(应该是用了第三个参数传递的消息码,如86对应回车什么的),再查查SendMessage发送鼠标消息……

有楼层帮你查到MSDN了,你又省事了一步。。。温馨提醒这个坐标系的clientArea转化是相对于目标窗体的。。。

回答满意且牛B的话,请加分
百度网友9c38907
2013-06-27 · TA获得超过421个赞
知道小有建树答主
回答量:350
采纳率:0%
帮助的人:362万
展开全部
楼主您好:
先看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值,所以按照这个写法应该是正确的。

希望对你有帮助,望采纳。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
linux001
2013-06-27 · TA获得超过1401个赞
知道大有可为答主
回答量:1665
采纳率:100%
帮助的人:1363万
展开全部
SendMessage 第二个参数,指定发送的消息类型, 如鼠标消息WM_LBUTTONDOWN,WM_MOUSEMOVE等。键盘消息:WM_KEYDOWN,WM_KEYUP

没问题,最后2个参数也不必转成句柄。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式