将另一个应用程序置于前台并向其发送输入

Bringing another application into foreground and sending input to it

我正在尝试恢复(甚至最大化)另一个应用程序并从我的项目向它发送输入。我可以为 NotepadSkype 等某些应用程序执行此操作,但它不适用于 TeamSpeak.
等其他应用程序 任何想法为什么以及如何解决问题?

这是我的代码:

private void winact()
{       
    IntPtr hWnd; //change this to IntPtr
    Process[] processRunning = Process.GetProcesses();

    string title, name;
    foreach (Process pr in processRunning)
    {
        title = pr.MainWindowTitle.ToLower();
        name = pr.ProcessName.ToLower();

        if (title.Contains("teamspeak".ToLower()) || name.Contains("teamspeak".ToLower()))
        {
            hWnd = pr.MainWindowHandle;
            ShowWindow(hWnd, 3);
            SetForegroundWindow(hWnd); //set to topmost
            break;
        }
    }
}  

我使用InputSimulator发送输入。

你能试试这个吗?我认为这应该适合你。

private void winact()
{
    IntPtr hWnd; //change this to IntPtr
    Process[] processRunning = Process.GetProcesses();

    string title, name;
    foreach (Process pr in processRunning)
    {
        title = pr.MainWindowTitle.ToLower();
        name = pr.ProcessName.ToLower();

        if (title.Contains("teamspeak".ToLower()) || name.Contains("teamspeak".ToLower()))
        {
            hWnd = pr.MainWindowHandle;
            HwndSource hwndSource = HwndSource.FromHwnd(hWnd);
            Window window = hwndSource.RootVisual as Window;
            window.Activate();
            window.TopMost = true;

            ShowWindow(hWnd, 3);
            SetForegroundWindow(hWnd); //set to topmost
            break;
        }
    }
}

显然问题是我的应用程序没有 运行 管理员权限。为了能够有效地将输入发送到其他应用程序,需要管理员角色。

为此,我在应用程序中添加了 app.manifest,并将 requestedExecutionLevel levelasInvoker 更改为 requireAdministrator
使用 InputSimulator 适用于其他应用程序,但某些应用程序(例如游戏)将输入视为简单消息,不会将击键处理为操作。然而,它们被传递到聊天。 (这是我注意到的)

为了解决这个问题,我在 autoIT 中编写了一个非常简单的脚本,它只是获取传递给它的参数(只有 1 个)并将参数作为击键发送到 window,目前在前景。该脚本被编译为我正在调用的可执行文件。

我确信有更好的方法,但这是我能做到的最好的方法。