在.NET6.0应用控制台创建
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
public static class Tset
{
//显示或隐藏窗口
[DllImport("user32.dll", SetLastError = true)]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
//启动或禁用窗口
[DllImport("user32.dll", SetLastError = true)]
public static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
//获取窗口类名
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
//查找窗口句柄
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
//窗口状态
const int SW_HIDE = 0;
public static void Main()
{
//地址可以做成从配置文件读取
string processName = "CIPCoreConsole"; // 进程名称
//程序地址
string exePath = @"C:\Program Files (x86)\OMRON\SYSMAC Gateway\bin\CIPCoreConsole.exe";
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = exePath,
CreateNoWindow = true, //不创建窗口
UseShellExecute = false,//创建新进程
};
// 启动外部应用程序
Process process = Process.Start(psi);
if (process != null)
{
Console.WriteLine("外部应用程序已启动");
// 等待一段时间确保外部应用程序已经启动
Thread.Sleep(3000);
// 查找窗口句柄
IntPtr hWnd = IntPtr.Zero;
while (hWnd == IntPtr.Zero)
{
Process[] processes = Process.GetProcessesByName(processName);
if (processes.Length > 0)
{
// 获取进程的主窗口句柄
hWnd = processes[0].MainWindowHandle;
if (hWnd != IntPtr.Zero)
{
Console.WriteLine($"找到进程 {processName} 的主窗口句柄: {hWnd}");
// 获取窗口类名
StringBuilder className = new StringBuilder(256);
GetClassName(hWnd, className, className.Capacity);
Console.WriteLine($"窗口类名: {className}");
// 隐藏窗口
bool success = ShowWindow(hWnd, SW_HIDE);
if (success)
{
Console.WriteLine("窗口成功隐藏");
Environment.Exit(0);
}
else
{
int error = Marshal.GetLastWin32Error();
Console.WriteLine($"隐藏窗口失败,错误码: {error}");
}
break;
}
else
{
Console.WriteLine($"找不到进程 {processName}");
}
}
Task.Delay(1000).Wait(); // 使用 Task.Delay 避免 Thread.Sleep 的阻塞
// 也可以使用 CancellationToken 来判断是否取消等待
}
//Console.WriteLine("按任意键结束...");
//Console.ReadKey();
}
}
}