2010-06-20 110 views
3

我试图将密钥发送给应用程序。为了方便测试,我只用了记事本。这就是代码的样子:C#和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); 
    } 

但没有任何反应。

我的主要目标是将密钥发送给高级应用程序,但我很乐意先将它发送到记事本。 我想使用SendMessage,因为我想控制按下按钮的时间长度,我也不想在前台使用其他应用程序。这就是我不使用SendKeys的原因。

回答

8

几个问题:

  • 你的声明是错误的,最后两个参数是IntPtr的,不是int
  • 你应该使用PostMessage的,不SendMessage函数
  • 要发送到错误的窗口。记事本的编辑窗口是一个子窗口
  • 你忘了发WM_KEYUP
  • 实际信你将取决于转移的国家重点

颈部射击:Vista和Win7 UIPI(用户界面特权隔离)可防止受限制的进程将消息注入到高级进程中。