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

C# 使用PostMessage()或SendMessage()发送大写字母,c#,sendmessage,postmessage,user32,C#,Sendmessage,Postmessage,User32,我正在尝试使用PostMessage()函数发送大写字母或符号(!@#等): [DllImport("user32.dll")] public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 我试着用大写字母发送shift和我想发送的信件,但似乎不起作用: public const uint WM_KEYUP = 0x0101;

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

[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
我试着用大写字母发送shift和我想发送的信件,但似乎不起作用:

        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键按下时,它没有检测到shift键按下的原因,你也可以使用keybd_事件()和SendKeys()。注意:这些方法不会将密钥发送到特定进程。

请尝试此方法,而不是使用WM_KEYDOWN和WM_keydup:

        public const uint WM_CHAR = 0x0102;

            ...

            PostMessage(process.MainWindowHandle, WM_CHAR, (IntPtr)'A', IntPtr.Zero);
完整解决方案:创建一个C#控制台应用程序(我的是.NET Framework 4.7.2)


您是否查看过发送键?它在Windows窗体中支持.NET,但您可以使用P/Invoke。是的,我查看了SendKeys,但我需要专门使用PostMessage()和SendMessage()因为我想将输入发送到特定进程。请给出一个如何使用调用的示例。这里有一个问题,因为您的修改键堆叠在物理键盘状态的顶部。您发送“SHIFT(keyup)”。如果SHIFT键实际按下了怎么办?现在你把程序搞乱了。或者,如果CTRL键(您没有为其生成事件)已关闭,该怎么办?现在程序认为键入了“SHIFT+CTRL+A”。而且,
IntPtr.Zero
对于LPRAM是不正确的。阅读以查看必须发送的内容。它应该可以工作。我已经用完整的解决方案更新了我的答案,我在给你答案之前运行了这个解决方案。试试看。
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();
        }
    }
}