C#中使用 SendMessage 向非顶端窗体发送组合键

 开门见山,不废话了, 直接举例说明一下:

比如发送ALT + F

以下是 用spy++截取的消息内容


<00001> 000310DC P WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
<00002> 000310DC P WM_SYSKEYDOWN nVirtKey:'F' cRepeat:1 ScanCode:21 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
<00003> 000310DC P WM_SYSCHAR chCharCode:'102' (102) cRepeat:1 ScanCode:21 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
<00004> 000310DC P WM_SYSKEYUP nVirtKey:'F' cRepeat:1 ScanCode:21 fExtended:0 fAltDown:1 fRepeat:1 fUp:1
<00005> 000310DC P WM_KEYUP nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

 

转换为 SendMessage

[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hwnd, int wMsg, uint wParam, uint lParam);

 

SendMessage(hwnd, 0x0104, 0x00000012, 0x20380001);//(0x00000012 == VK_MENU(ALT键))
SendMessage(hwnd, 0x0104, 0x00000046, 0x20210001);//这一行可以省略(0x00000046 == 'F')

SendMessage(hwnd, 0x0106, 0x00000066, 0x20210001);//发送一个char 'f'
SendMessage(hwnd, 0x0105, 0x00000046, 0xE0210001);//这一行可以省略(0x00000046 == 'F')
SendMessage(hwnd, 0x0105, 0x00000012, 0xC0380001);//(0x00000012 == VK_MENU(ALT键))

 

过程是这样的:

 

首先 发送了一个 ALT按下 //(WM_SYSKEYDOWN == 0x0104)

然后 发送了一个 'F'键      //这里省略可以实现同样功能 系统兼容性问题 建议发送这个键

然后 发送了一个 字符'f'    //(WM_SYSCHAR == 0x0106)

然后 抬起按键     'F'键     //这里省略可以实现同样功能 系统兼容性问题 建议发送这个键

最后 抬起按键     ALT键    //(WM_SYSKEYUP == 0x0105)

 

要实现类似功能 比如 ALT + a 可以这么写

SendMessage(hwnd, 0x0104, 0x00000012, 0x20380001);//0x00000012可以写成0x12
SendMessage(hwnd, 0x0104, 0x00000041, 0x201E0001);//0x00000041可以写成0x41

SendMessage(hwnd, 0x0106, (int)'a', 0x20210001);// (把char转换为 int 或者API声明时传递参数wParam为char)
SendMessage(hwnd, 0x0105, 0x00000041, 0xE01E0001);//0x00000041 == 'A'
SendMessage(hwnd, 0x0105, 0x00000012, 0xC0380001);//

 

下面列举一下键盘按键对应值:

//Windows 使用的256个虚拟键码
public const int VK_LBUTTON = 0x1
public const int VK_RBUTTON = 0x2
public const int VK_CANCEL = 0x3
public const int VK_MBUTTON = 0x4
public const int VK_BACK = 0x8
public const

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值