sendMessage 虚拟键码

本文介绍了如何使用SendMessage函数模拟按下和释放键盘上的组合键,如ALT+F,详细解析了参数含义和虚拟键码,提供了代码示例。
摘要由CSDN通过智能技术生成
开门见山,不废话了, 直接举例说明一下:

比如发送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);//

好的,我会尽力回答你的问题。 首先,使用C++/CLI封装sendmessageAPI函数,可以将VB6 API函数封装为C++/CLI的类库,并在VB.NET中进行引用。在C++/CLI中,可以使用.NET框架中的任何类型,因此可以使用任何类型的参数进行调用。 下面是一个示例代码,展示了如何使用C++/CLI封装sendmessageAPI函数,并在VB.NET中调用时使用int和string类型的参数: 1. 首先,创建一个新的C++/CLI类库项目,并添加一个名为SendMessageWrapper的类。在该类中添加以下代码: ```cpp #pragma once #include <Windows.h> using namespace System; namespace SendMessageWrapper { public ref class SendMessageAPI { public: static IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, String^ lParam) { pin_ptr<const wchar_t> lpwstr = PtrToStringChars(lParam); return ::SendMessage(hWnd.ToPointer(), msg, wParam, (LPARAM)lpwstr); } }; } ``` 在上述代码中,使用using namespace System;导入命名空间,以便使用.NET框架中的类型。创建了一个名为SendMessageAPI的公共静态类,其中定义了一个静态方法SendMessage,该方法使用IntPtr、int和String^类型的参数,并返回一个IntPtr类型的值。在方法中,使用pin_ptr<const wchar_t> lpwstr = PtrToStringChars(lParam);将String^类型的参数转换为const wchar_t*类型的指针,然后调用sendmessageAPI函数,将IntPtr和int类型的参数转换为对应的指针类型并传入。最后,将sendmessageAPI函数的返回值转换为IntPtr类型并返回。 2. 在VB.NET项目中添加对C++/CLI类库的引用,并使用以下代码调用sendmessageAPI函数: ```vb.net Imports SendMessageWrapper Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim hWnd As IntPtr = Me.Handle '获取窗口句柄 Dim msg As Integer = &H100 'WM_KEYDOWN消息 Dim wParam As Integer = Keys.A '盘A虚拟键码,可以是int类型 Dim lParam As String = "Hello World!" 'LPARAM参数,可以是string类型 Dim result As IntPtr = SendMessageAPI.SendMessage(hWnd, msg, wParam, lParam) '调用封装后的API sendmessage MessageBox.Show(result.ToString()) '显示返回值 End Sub End Class ``` 在上述代码中,首先使用Imports SendMessageWrapper导入C++/CLI类库的命名空间,以便在VB.NET中使用SendMessageAPI类。然后,在Button1_Click事件处理程序中,获取当前窗口的句柄,然后调用SendMessageAPI类的SendMessage静态方法发送一个盘A的WM_KEYDOWN消息,并将虚拟键码和LPARAM参数分别设置为Keys.A和"Hello World!",这两个参数分别是int和string类型。需要注意的是,因为C++/CLI中使用的是IntPtr和String^类型的参数,因此需要将int和string类型的参数显式转换为对应的类型。最后,将SendMessageAPI类的SendMessage方法的返回值转换为IntPtr类型并显示在MessageBox中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值