C#向另一个窗口/进程发送键盘命令

24

我正在尝试编写一个程序,将数据传递到另一个窗口/进程。

这是我目前的代码,但我无法弄清楚如何向OUTLOOK进程发送键盘命令。

我想要使用Tab键和Enter键的命令。

这是我迄今为止尝试过的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Windows.Forms;

namespace Config
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            System.Threading.Thread.Sleep(30);//300000
            TextReader tr = new StreamReader("config.txt");
            Clipboard.SetText(tr.ReadLine());
            tr.Close();

            var proc = Process.GetProcessesByName("OUTLOOK").FirstOrDefault();
            if (proc != null && proc.MainWindowHandle != IntPtr.Zero)
            {
                SetForegroundWindow(proc.MainWindowHandle);
                //SendKeys.Send("{ENTER}");
                //   Clipboard.GetText();
            }
        }

        [DllImport("user32")]
        private static extern bool SetForegroundWindow(IntPtr hwnd);
    }
}

SendMessage就是你要找的东西。 也许你的问题已经在这里得到解决了:https://dev59.com/LnRB5IYBdhLWcg3wxZxK - arminb
3个回答

19
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
 
public void Start()
{
    IntPtr zero = IntPtr.Zero;
    for (int i = 0; (i < 60) && (zero == IntPtr.Zero); i++)
    {
        Thread.Sleep(500);
        zero = FindWindow(null, "YourWindowName");
    }
    if (zero != IntPtr.Zero)
    {
        SetForegroundWindow(zero);
        SendKeys.SendWait("{TAB}");
        SendKeys.SendWait("{TAB}");
        SendKeys.SendWait("{ENTER}");
        SendKeys.Flush();
    }
}

7
“SendKeys” 功能不稳定。假设另一个窗口出现在前台,那么你发送的按键信息就会发送到错误的应用程序中。 - arminb
抱歉打扰,不过你有任何想法如何在互联网上完成这个任务吗?我需要做基本相同的事情,但目标应用程序/进程正在另一台机器上运行! - pookie
有人能帮忙吗?我已经完成了,它也在工作,但是我遇到了一个大问题。我无法再次使用表单。我创建了一个表单并放置了开始和停止按钮。但是我无法选择该表单以单击停止... 请给予任何提示,谢谢!!! - user3790692
我发现这个对我很有帮助:https://dev59.com/cHA75IYBdhLWcg3w49YR - Fredy
@pookie,你的问题不太清楚。你所说的“通过互联网”是什么意思?计算机并非魔法。:)你如何在互联网上按下另一台机器上的实际按键?那个远程工具可以帮助你发送按键。 - The incredible Jan
@TheincredibleJan 这个问题已经快12年了... - pookie

11

我写了几个程序,可以向后台窗口发送按键,通常使用PostMessage/SendMessage实现。 我在这里记录了我所有的发现!

但基本上你将使用低级c调用将消息放入窗口消息队列中,以允许应用程序捕获按键。

PostMessage

SendMessage

如果您有任何问题,请告诉我,我的库是用C#编写的,我很乐意分享它。 这种方法还允许在后台窗口中使用鼠标 :)

所有代码都已提交到GitHub:https://github.com/EasyAsABC123/Keyboard


如果我也想模拟 ModifierKeys 怎么办? - deathrace
@deathrace 很好的问题!从我找到的内容来看,这似乎并不总是有效,因为它们是全局修饰符。所以我使用了全局按键方法,然后按下背景键,它会接受修饰符为已按下状态。然后我取消前景按键修饰符。通常按键时间很短,不会影响任何东西...但是,我一直觉得这样做离注入一个监听按键API调用的DLL程序还有差距。 - abc123

1

考虑到你知道要发送给Outlook进程的键盘命令是什么时候什么,你需要使用SendMessage Windows API函数。

只是一个示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接