C# 切换到另一个正在运行的进程
有人能解释一下我将如何通过C#转换到另一个正在运行的程序吗 例如,如果我创建了一个带有按钮事件的新应用程序,我想用按钮来表示调用internet explorer或word之类的开放应用程序 我知道如何启动应用程序,但不太确定在应用程序已经运行时如何调用它们 这是迄今为止一直在进行的工作:C# 切换到另一个正在运行的进程,c#,process,switch-statement,C#,Process,Switch Statement,有人能解释一下我将如何通过C#转换到另一个正在运行的程序吗 例如,如果我创建了一个带有按钮事件的新应用程序,我想用按钮来表示调用internet explorer或word之类的开放应用程序 我知道如何启动应用程序,但不太确定在应用程序已经运行时如何调用它们 这是迄今为止一直在进行的工作: if (System.Diagnostics.Process.GetProcessesByName("ExternalApplication").Length >= 1) {
if (System.Diagnostics.Process.GetProcessesByName("ExternalApplication").Length >= 1)
{
foreach (Process ObjProcess in System.Diagnostics.Process.GetProcessesByName("ExternalApplication"))
{
ActivateApplication(ObjProcess.Id);
Interaction.AppActivate(ObjProcess.Id);
SendKeys.SendWait("~");
}
}
我必须解决一个类似的问题,我必须做一些pInvoking来完成它。请参阅下面的代码
delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);
public static class WindowEnumerator
{
[DllImport("user32.dll", SetLastError = true)]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("USER32.DLL")]
private static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam);
[DllImport("USER32.DLL")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("USER32.DLL")]
private static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("USER32.DLL")]
private static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("USER32.DLL")]
private static extern IntPtr GetShellWindow();
public static IDictionary<IntPtr, string> GetOpenWindowsFromPID(int processID)
{
IntPtr hShellWindow = GetShellWindow();
Dictionary<IntPtr, string> dictWindows = new Dictionary<IntPtr, string>();
EnumWindows(delegate(IntPtr hWnd, int lParam)
{
if (hWnd == hShellWindow) return true;
if (!IsWindowVisible(hWnd)) return true;
int length = GetWindowTextLength(hWnd);
if (length == 0) return true;
uint windowPid;
GetWindowThreadProcessId(hWnd, out windowPid);
if (windowPid != processID) return true;
StringBuilder stringBuilder = new StringBuilder(length);
GetWindowText(hWnd, stringBuilder, length + 1);
dictWindows.Add(hWnd, stringBuilder.ToString());
return true;
}, 0);
return dictWindows;
}
}
...
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);
...
Process yourProcess = ???;
Dictionary<IntPtr, string> windows = (Dictionary<IntPtr, string>)WindowEnumerator.GetOpenWindowsFromPID(yourProcess.Id);
IntPtr mainWindowHandle = IntPtr.Zero;
foreach (KeyValuePair<IntPtr, string> pair in windows)
{
if (pair.Value.ToUpperInvariant() == "Main Window Title")
{
mainWindowHandle = pair.Key;
break;
}
}
if (mainWindowHandle != IntPtr.Zero)
{
if (IsIconic(mainWindowHandle))
{
ShowWindow(mainWindowHandle, 9);
}
SetForegroundWindow(mainWindowHandle);
}
委托bool EnumWindowsProc(IntPtr hWnd,intlparam);
公共静态类WindowEnumerator
{
[DllImport(“user32.dll”,SetLastError=true)]
私有静态外部单元GetWindowThreadProcessId(IntPtr hWnd,out单元lpdwProcessId);
[DllImport(“USER32.DLL”)]
私有静态外部bool EnumWindows(EnumWindowsProc enumFunc,int lParam);
[DllImport(“USER32.DLL”)]
私有静态外部int GetWindowText(IntPtr hWnd、StringBuilder lpString、int nMaxCount);
[DllImport(“USER32.DLL”)]
私有静态外部int GetWindowTextLength(IntPtr hWnd);
[DllImport(“USER32.DLL”)]
私有静态外部bool IsWindowVisible(IntPtr hWnd);
[DllImport(“USER32.DLL”)]
私有静态外部IntPtr GetShellWindow();
公共静态IDictionary GetOpenWindowsFromPID(int-processID)
{
IntPtr hShellWindow=GetShellWindow();
Dictionary dictWindows=newdictionary();
枚举窗口(委托(IntPtr hWnd、int lParam)
{
if(hWnd==hShellWindow)返回true;
如果(!IsWindowVisible(hWnd))返回true;
int length=GetWindowTextLength(hWnd);
if(length==0)返回true;
uint窗口pid;
GetWindowThreadProcessId(hWnd,out windowPid);
if(windowPid!=processID)返回true;
StringBuilder StringBuilder=新StringBuilder(长度);
GetWindowText(hWnd,stringBuilder,长度+1);
dictWindows.Add(hWnd,stringBuilder.ToString());
返回true;
}, 0);
返回窗口;
}
}
...
[DllImport(“user32.dll”)]
私有静态外部bool setforegroundindow(IntPtr hWnd);
[DllImport(“user32.dll”)]
专用静态外部布尔显示窗口(IntPtr hWnd、int nCmdShow);
[DllImport(“user32.dll”)]
私有静态外部边界(IntPtr hWnd);
...
进程进程=???;
字典窗口=(字典)WindowEnumerator.GetOpenWindowsFromPID(yourProcess.Id);
IntPtr mainWindowHandle=IntPtr.Zero;
foreach(windows中的KeyValuePair对)
{
if(pair.Value.ToUpperInvariant()=“主窗口标题”)
{
mainWindowHandle=pair.Key;
打破
}
}
如果(mainWindowHandle!=IntPtr.Zero)
{
if(IsIconic(主窗口句柄))
{
显示窗口(主窗口手柄,9);
}
SetForegroundWindow(主窗口句柄);
}
我正在使用以下内容,但我认为第31行没有正确定义流程名称
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace test_winform_app
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);
private void button1_Click(object sender, EventArgs e)
{
Process yourProcess = Process.GetProcessesByName("notepad");
Dictionary<IntPtr, string> windows = (Dictionary<IntPtr, string>)WindowEnumerator.GetOpenWindowsFromPID(yourProcess.Id);
IntPtr mainWindowHandle = IntPtr.Zero;
foreach (KeyValuePair<IntPtr, string> pair in windows)
{
if (pair.Value.ToUpperInvariant() == "Main Window Title")
{
mainWindowHandle = pair.Key;
break;
}
}
if (mainWindowHandle != IntPtr.Zero)
{
if (IsIconic(mainWindowHandle))
{
ShowWindow(mainWindowHandle, 9);
}
SetForegroundWindow(mainWindowHandle);
}
}
delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);
public static class WindowEnumerator
{
[DllImport("user32.dll", SetLastError = true)]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("USER32.DLL")]
private static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam);
[DllImport("USER32.DLL")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("USER32.DLL")]
private static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("USER32.DLL")]
private static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("USER32.DLL")]
private static extern IntPtr GetShellWindow();
public static IDictionary<IntPtr, string> GetOpenWindowsFromPID(int processID)
{
IntPtr hShellWindow = GetShellWindow();
Dictionary<IntPtr, string> dictWindows = new Dictionary<IntPtr, string>();
EnumWindows(delegate(IntPtr hWnd, int lParam)
{
if (hWnd == hShellWindow) return true;
if (!IsWindowVisible(hWnd)) return true;
int length = GetWindowTextLength(hWnd);
if (length == 0) return true;
uint windowPid;
GetWindowThreadProcessId(hWnd, out windowPid);
if (windowPid != processID) return true;
StringBuilder stringBuilder = new StringBuilder(length);
GetWindowText(hWnd, stringBuilder, length + 1);
dictWindows.Add(hWnd, stringBuilder.ToString());
return true;
}, 0);
return dictWindows;
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用系统诊断;
使用System.Runtime.InteropServices;
名称空间测试\u winform\u应用程序
{
公共部分类表单2:表单
{
公共表格2()
{
初始化组件();
}
[DllImport(“user32.dll”)]
私有静态外部bool setforegroundindow(IntPtr hWnd);
[DllImport(“user32.dll”)]
专用静态外部布尔显示窗口(IntPtr hWnd、int nCmdShow);
[DllImport(“user32.dll”)]
私有静态外部边界(IntPtr hWnd);
私有无效按钮1\u单击(对象发送者,事件参数e)
{
Process yourProcess=Process.GetProcessesByName(“记事本”);
字典窗口=(字典)WindowEnumerator.GetOpenWindowsFromPID(yourProcess.Id);
IntPtr mainWindowHandle=IntPtr.Zero;
foreach(windows中的KeyValuePair对)
{
if(pair.Value.ToUpperInvariant()=“主窗口标题”)
{
mainWindowHandle=pair.Key;
打破
}
}
如果(mainWindowHandle!=IntPtr.Zero)
{
if(IsIconic(主窗口句柄))
{
显示窗口(主窗口手柄,9);
}
SetForegroundWindow(主窗口句柄);
}
}
委托bool EnumWindowsProc(IntPtr hWnd、intlparam);
公共静态类WindowEnumerator
{
[DllImport(“user32.dll”,SetLastError=true)]
私有静态外部单元GetWindowThreadProcessId(IntPtr hWnd,out单元lpdwProcessId);
[DllImport(“USER32.DLL”)]
私有静态外部bool EnumWindows(EnumWindowsProc enumFunc,int lParam);
[DllImport(“USER32.DLL”)]
私有静态外部int GetWindowText(IntPtr hWnd、StringBuilder lpString、int nMaxCount);
[DllImport(“USER32.DLL”)]
私有静态外部int GetWindowTextLength(IntPtr hWnd);
[DllImport(“USER32.DLL”)]
私有静态外部bool IsWindowVisible(IntPtr hWnd);
[DllImport(“USER32.DLL”)]
私有静态外部IntPtr GetShellWindow();
公共静态IDictionary GetOpenWindowsFromPID(int-processID)
{
IntPtr hShellWindow=GetShellWindow();
Dictionary dictWindows=newdictionary();
枚举窗口(委托(IntPtr hWnd、int lParam)
{
if(hWnd==hShellWindow)返回true;
如果(!IsWindowVisible(hWnd))返回true;
int length=GetWindowTextLength(hWnd);
if(length==0)返回true;
uint窗口pid;
GetWindowThreadProcessId(hWnd,out windowPid);
if(windowPid!=processID)返回
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace SingleInstanceWindow
{
static class Program
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
var me = Process.GetCurrentProcess();
var arrProcesses = Process.GetProcessesByName(me.ProcessName);
if (arrProcesses.Length > 1)
{
SetForegroundWindow(arrProcesses[0].MainWindowHandle);
return;
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
[DllImport("user32.dll")]
public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
SwitchToThisWindow(arrProcesses[0].MainWindowHandle, true);