名为PostMessage的c#api
我正试图写一个应用程序来处理并发送给他 按ctrl-a,然后按ctrl-c,我将获得 我的剪贴板中的文本内容 我读到正确的api是名为PostMessage的c#api,c#,input,postmessage,keystrokes,C#,Input,Postmessage,Keystrokes,我正试图写一个应用程序来处理并发送给他 按ctrl-a,然后按ctrl-c,我将获得 我的剪贴板中的文本内容 我读到正确的api是PostMessage`Sendmeesage`。 使用api,我成功地将代码写入程序(例如记事本)。 但我没有成功发送击键 这是我的密码 public const uint WM_KEYDOWN = 0x0100; public const uint WM_KEYUP = 0x0101; const int CTRL = 0x11;
PostMessage
`Sendmeesage`。
使用api,我成功地将代码写入程序(例如记事本)。
但我没有成功发送击键
这是我的密码
public const uint WM_KEYDOWN = 0x0100;
public const uint WM_KEYUP = 0x0101;
const int CTRL = 0x11;
const int A_Key = 0x41;
const int C_Key = 0x43;
static void Main(string[] args)
{
IntPtr hWnd = FindWindow(null, "Microsoft Word ");
hWnd = FindWindowEx(hWnd, null, "Edit", null);
//PostMessage(hWnd, WM_GETTEXT, 0x11, 0);
Process[] processes = Process.GetProcessesByName("winword");
foreach (Process p in processes)
{
PostMessage((IntPtr)hWnd, WM_KEYDOWN, (IntPtr)CTRL, 1);
PostMessage((IntPtr)hWnd, WM_KEYDOWN, (IntPtr)A_Key, 1);
PostMessage((IntPtr)hWnd, WM_KEYUP, (IntPtr)A_Key, 1);
PostMessage((IntPtr)hWnd, WM_KEYUP, (IntPtr)CTRL, 1);
}
}
我做错了什么 也许,您使用了错误的API来满足正确的需求。您可能会观察到消息的顺序与您编码的一样,但是,按该顺序发布消息可能不会像您认为的那样。如果你决心用这种方法解决问题,请阅读并看看短暂的延迟是否有帮助。
但是,我建议使用更好的方法来使用SendInput()函数,该函数旨在服务于类似的场景。有关详细信息,请检查和。Microsoft Word没有名为“编辑”的客户端窗口。使用Spy++查看窗口层次结构和名称。延迟没有帮助,因为我不想关注应用程序。它应该作为一个后卫。spy++在日志中为我的应用程序和实际按下ctrl-a ctrl-c显示了相同的行。如上所述,并非所有程序都只按消息ID和顺序处理输入,word是复杂的输入处理应用程序,延迟没有帮助我一点也不奇怪。通常,所使用的调用(如)不能“用PostMessage()管理”。SendInput是你最好的选择,依我看。