locked
FAQs:如何输入到另一个应用程序中? RRS feed

答案

  • .NET通过SendKey类提供了一种简单的方法输入到另一个应用程序中。但是,有一些限制:
    1. 目标程序当前必须是活动状态。所以,我们必须在执行SendKey类执行激活目标程序。Windows API 函数FindWindow可以帮我们返回目标程序的窗口句柄,SetForegroudWindow函数可以激活指定的程序窗口。
    2. SendKey不支持非连接的会话。
    3. 当程序试图在网络中使用或利用键盘的变化时,SendKey可能引起不可预见的结果。

    更多利用SendKey传送不同值的信息,请参阅MSDN文档:
    http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx

    查找写字板程序,并输入内容的代码片段:
    [DllImport("user32.dll", EntryPoint = "FindWindow")]
            private static extern IntPtr FindWindow(string lp1, string lp2);

            [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool SetForegroundWindow(IntPtr hWnd);

            private void button1_Click(object sender, EventArgs e)
            {
                // 找到写字板程序的句柄
                IntPtr handle = FindWindow("Notepad", "Untitled - Notepad");
                if (!handle.Equals(IntPtr.Zero))
                {
                    // 激活写字板窗口
                    if (SetForegroundWindow(handle))
                    {
                        // 发送 "Hello World!"
                        SendKeys.Send("Hello World!");
                        // 发送 "Tab"
                        SendKeys.Send("{TAB}");
                        // 发送 "Enter"
                        SendKeys.Send("{ENTER}");
                    }           
                }
            }
    相关的帖子:
    http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/2d38d219-b6ea-42d8-92fe-5af344ea820e

    我们也可以用Windows API函数SendMessage和PostMessage发送WM_SETTEXT消息至同一窗口。
    SendMessage和PostMessage重要的区别在于:SendMessage发送消息至另一窗口,调用该窗口并等待返回值,而PostMessage发送消息至指定窗口创建的可访问消息队列的线程,并且不等待,立即返回。

    关于这两个Windows API函数更多的细节内容,请参阅http://msdn.microsoft.com/en-us/magazine/cc301431.aspx
    这里是用SendMessage方法在写字板中输入内容的代码片段:
    private const int WM_SETTEXT = 0x000C;
    [DllImport("user32.dll")]
    private static extern IntPtr FindWindow(
        string lpClassName,
        string lpWindowName);

    [DllImport("User32.dll")]
    private static extern IntPtr FindWindowEx(
        IntPtr hwndParent,
        IntPtr hwndChildAfter,
        string lpszClass,
    string lpszWindows);
    [DllImport("User32.dll")]
    private static extern Int32 SendMessage(
        IntPtr hWnd,              
        int Msg,               
        IntPtr wParam,            
    StringBuilder lParam);
    private void button1_Click(object sender, EventArgs e)
    {
        // 返回写字板主窗口句柄
        IntPtr hWnd = FindWindow("Notepad", "Untitled - Notepad");
        if (!hWnd.Equals(IntPtr.Zero))
        {
            //返回写字板编辑窗口句柄
            IntPtr edithWnd = FindWindowEx(hWnd, IntPtr.Zero, "Edit", null);
            if (!edithWnd.Equals(IntPtr.Zero))
                // 发送WM_SETTEXT 消息: "Hello World!"
                SendMessage(edithWnd, WM_SETTEXT, IntPtr.Zero, new StringBuilder("Hello World!"));
        }
    }

    注意点:
    我们可以使用Visual Studoi自带的SPY++追踪窗口消息,然后用SendM和PostM模拟。
    更多关于如何使用SPY++的信息,请参阅MSDN文档:
    http://msdn.microsoft.com/en-us/library/aa264396(VS.60).aspx
    你也可以参阅Benjamin Wulfe的MSDN杂志文章:
    http://msdn.microsoft.com/en-us/magazine/cc163617.aspx


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    MSDN 论坛好帮手 立刻免费下载  MSDN 论坛好帮手
    2011年3月3日 5:34