我正在尝试恢复(甚至最大化)另一个应用程序并从我的项目向它发送输入。我可以针对某些应用程序执行此操作,例如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发送输入。
答案 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 level
从asInvoker
更改为requireAdministrator
。
使用InputSimulator
适用于其他应用程序,但某些应用程序(如游戏)认为输入是一个简单的消息,不会将键击作为操作处理。然而,他们被传递到聊天室。 (这是我注意到的)
为了解决这个问题,我在autoIT中编写了一个非常简单的脚本,它只是将传递给它的参数(仅为1)并将参数作为击键发送到窗口,当前位于前台。编译脚本导致我正在调用的可执行文件。
我确信有更好的方法,但这是我设法做到的最好的方法。