我正在尝试使用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()。注意:这些方法不会将密钥发送到特定进程。
答案 0 :(得分:1)
尝试使用此方法,而不要使用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();
}
}
}