C#和SendMessage(键)不起作用

Fer*_*roc 4 c# pinvoke sendmessage

我试图将密钥发送到应用程序.为了方便测试,我只使用了记事本.这就是代码的样子:

[DllImport("USER32.DLL", EntryPoint = "SendMessageW", SetLastError = true,
         CharSet = CharSet.Unicode, ExactSpelling = true,
         CallingConvention = CallingConvention.StdCall)]
    public static extern bool SendMessage(IntPtr hwnd, int Msg, int wParam, int lParam);


        const int WM_KEYDOWN = 0x100;
    const int WM_a = 0x41;

        public void Press()
    {
        Process[] p = Process.GetProcessesByName("notepad");
        IntPtr pHandle = p[0].MainWindowHandle;

        SendMessage(pHandle, WM_KEYDOWN, WM_a, 0);
    }
Run Code Online (Sandbox Code Playgroud)

但没有任何反应.

我的主要目标是将密钥发送到提升的应用程序,但我很乐意首先将其发送到记事本.我想使用SendMessage,因为我想控制按下按钮多长时间,我也不希望将其他应用程序放在前台.这就是我不使用SendKeys的原因.

Han*_*ant 9

几个问题:

  • 您的声明是错误的,最后2个参数是IntPtr,而不是int
  • 您应该使用PostMessage,而不是SendMessage
  • 你发送到错误的窗口.记事本的编辑窗口是一个子窗口
  • 您忘记发送WM_KEYUP
  • 您获得的实际字母取决于Shift键的状态

颈部镜头:Vista和Win7 UIPI(用户界面权限隔离)可防止受限制的进程将消息注入升级进程.