将另一个应用程序置于前台并向其发送输入
Bringing another application into foreground and sending input to it
我正在尝试恢复(甚至最大化)另一个应用程序并从我的项目向它发送输入。我可以为 Notepad
或 Skype
等某些应用程序执行此操作,但它不适用于 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 level
从 asInvoker
更改为 requireAdministrator
。
使用 InputSimulator
适用于其他应用程序,但某些应用程序(例如游戏)将输入视为简单消息,不会将击键处理为操作。然而,它们被传递到聊天。 (这是我注意到的)
为了解决这个问题,我在 autoIT 中编写了一个非常简单的脚本,它只是获取传递给它的参数(只有 1 个)并将参数作为击键发送到 window,目前在前景。该脚本被编译为我正在调用的可执行文件。
我确信有更好的方法,但这是我能做到的最好的方法。
我正在尝试恢复(甚至最大化)另一个应用程序并从我的项目向它发送输入。我可以为 Notepad
或 Skype
等某些应用程序执行此操作,但它不适用于 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 level
从 asInvoker
更改为 requireAdministrator
。
使用 InputSimulator
适用于其他应用程序,但某些应用程序(例如游戏)将输入视为简单消息,不会将击键处理为操作。然而,它们被传递到聊天。 (这是我注意到的)
为了解决这个问题,我在 autoIT 中编写了一个非常简单的脚本,它只是获取传递给它的参数(只有 1 个)并将参数作为击键发送到 window,目前在前景。该脚本被编译为我正在调用的可执行文件。
我确信有更好的方法,但这是我能做到的最好的方法。