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

时间:2016-08-17 00:07:07

标签: c# wpf process

我正在尝试恢复(甚至最大化)另一个应用程序并从我的项目向它发送输入。我可以针对某些应用程序执行此操作,例如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发送输入。

2 个答案:

答案 0 :(得分:0)

你可以尝试一下吗?我认为这对你有用。

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;
        }
    }
}

答案 1 :(得分:0)

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

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

为了解决这个问题,我在autoIT中编写了一个非常简单的脚本,它只是将传递给它的参数(仅为1)并将参数作为击键发送到窗口,当前位于前台。编译脚本导致我正在调用的可执行文件。

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