gpt4 book ai didi

c# - 从 C# 关闭最小化/图标化进程

转载 作者:行者123 更新时间:2023-11-30 17:25:06 24 4
gpt4 key购买 nike

这是我的问题:我需要从 C# 程序中关闭一个已经在运行的进程。问题是该进程现在作为图标运行(最小化到任务栏),除非用户至少打开它一次(在无人值守的机器上永远不会发生),否则它永远不会有一个主窗口。

我的另一个要求是应用程序关闭而不是终止。我需要它来将它的内存缓冲区写入磁盘 - 杀死它会导致数据丢失。

到目前为止,这是我尝试过的:

        foreach (Process proc in Process.GetProcesses())
{
if (proc.ProcessName.ToLower().StartsWith("myapp"))
{
if (proc.MainWindowHandle.ToInt32() != 0)
{
proc.CloseMainWindow();
proc.Close();
//proc.Kill(); <--- not good!
}
}
}

在发现窗口最小化时 MainWindowHandle == 0 之后,我添加了 if 子句。删除 if 没有帮助。 CloseMainWindow()Close() 都不起作用。 Kill() 可以,但如上所述 - 这不是我需要的。

任何想法都会被接受,包括使用神秘的 Win32 API 函数:)

最佳答案

这应该有效:

[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern IntPtr FindWindow(string className, string windowName);
[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

private const int WM_CLOSE = 0x10;
private const int WM_QUIT = 0x12;

public void SearchAndDestroy(string windowName)
{
IntPtr hWnd = FindWindow(null, windowName);
if (hWnd == IntPtr.Zero)
throw new Exception("Couldn't find window!");
SendMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
}

由于某些窗口不响应 WM_CLOSE,因此可能必须发送 WM_QUIT。这些声明应该适用于 32 位和 64 位。

关于c# - 从 C# 关闭最小化/图标化进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/110336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com