【问题标题】:c# api named PostMessagec# api命名PostMessage
【发布时间】:2013-01-06 17:22:03
【问题描述】:

我正在尝试编写一个应用程序来处理并发送给他 击键 ctrl-a 然后 ctrl-c 我将拥有 剪贴板中的文本内容。

我读到正确的 api 是 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);

                }
            } 

我做错了什么?

【问题讨论】:

  • Microsoft Word 没有有一个名为“编辑”的客户端窗口。使用 Spy++ 查看窗口层次结构和名称。

标签: c# input postmessage keystrokes


【解决方案1】:

也许,您使用了错误的 API 来满足正确的需求。您可能会观察到消息的顺序与您编写的一样,但是按该顺序发布消息可能不会像您想象的那样。如果您决心以这种方式解决,请阅读 this post>> 并查看短暂的延迟是否有帮助。 但是,我建议采用更好的方法来使用旨在服务于类似场景的 SendInput() 函数。查看 this link>> 和 this link>> 了解更多信息。

【讨论】:

  • 好吧,延迟没有帮助,因为我不想专注于应用程序。它应该作为背景。并且 spy++ 在日志中为我的应用程序和真正按下 ctrl-a ctrl-c 显示了相同的行。
  • 如上所述,并非所有程序都仅通过消息 ID 和顺序来处理输入,word 是复杂的输入处理应用程序,我并不惊讶延迟没有帮助。通常,使用诸如 msdn.microsoft.com/en-us/library/windows/desktop/…> 之类的调用,而不能使用 PostMessage() 进行管理。 SendInput 是您最好的选择,IMO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2010-12-25
相关资源
最近更新 更多