使用 PostMessage() 或 SendMessage() 发送大写字母



我正在尝试使用 PostMessage(( 函数发送大写字母或符号(!@# 等(:

[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

我尝试以大写形式发送班次和我想发送的信件,但它似乎不起作用:

public const uint WM_KEYUP = 0x0101;
public const uint WM_KEYDOWN = 0x100;
void function()
{
Keys key = Keys.A;
Keys shift = Keys.ShiftKey;
PostMessage(process.MainWindowHandle, WM_KEYDOWN, (IntPtr)shift, IntPtr.Zero);
PostMessage(process.MainWindowHandle, WM_KEYDOWN, (IntPtr)key, IntPtr.Zero);
PostMessage(process.MainWindowHandle, WM_KEYUP, (IntPtr)shift, IntPtr.Zero);
PostMessage(process.MainWindowHandle, WM_KEYUP, (IntPtr)key, IntPtr.Zero);
}

编辑:对于那些想知道的人:我最终使用 SendInput(( 发送 shift 键,因为显然许多游戏检测 shift 键的方式与它们检测其他按键的方式不同,这就是为什么当我尝试使用 PostMessage(( 发送时它没有检测到 shift 键按下,您也可以使用 keybd_event(( 和 SendKeys((。注意:这些方法不会将密钥发送到特定进程。

尝试这个而不是使用 WM_KEYDOWN 和 WM_KEYUP:

public const uint WM_CHAR = 0x0102;
...
PostMessage(process.MainWindowHandle, WM_CHAR, (IntPtr)'A', IntPtr.Zero);

完整解决方案:创建一个 C# 控制台应用程序(我的是 .NET Framework 4.7.2(

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace PostMessageTest
{
class Program
{
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public const uint WM_CHAR = 0x0102;
public static void function()
{
IntPtr handle = Process.GetCurrentProcess().MainWindowHandle;
Console.WriteLine("Sending Keys...");
PostMessage(handle, WM_CHAR, (IntPtr)'A', IntPtr.Zero); // 0x41
}
static void Main(string[] args)
{
function();
Console.Read();
}
}
}

最新更新