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

时间:2020-06-01 21:52:25

标签: c# sendmessage postmessage user32

我正在尝试使用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()。注意:这些方法不会将密钥发送到特定进程。

1 个答案:

答案 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();
        }
    }
}