C# 在windows中隐藏任何应用程序

C# 在windows中隐藏任何应用程序,c#,winforms,C#,Winforms,我正在开发一个以编程方式隐藏外部进程窗口的应用程序,我尝试了几种技术,但它们似乎都不能与任何应用程序正常工作。例如,我成功地隐藏了notepad.exe,但当我试图隐藏基于java的应用程序时,什么也没有发生 下面是我使用的一些代码示例: Process p = new Process(); p.StartInfo.FileName = path; p.StartInfo.UseShellExecute = false; p.StartInfo.CreateNoWindow = true;

我正在开发一个以编程方式隐藏外部进程窗口的应用程序,我尝试了几种技术,但它们似乎都不能与任何应用程序正常工作。例如,我成功地隐藏了notepad.exe,但当我试图隐藏基于java的应用程序时,什么也没有发生

下面是我使用的一些代码示例:

Process p = new Process();

p.StartInfo.FileName = path;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;

p.Start();
还是这个

Process p = new Process();

p.StartInfo.FileName = path;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

p.Start();
我甚至试着用这种方式把窗户移出屏幕

Process p = new Process();

p.StartInfo.FileName = path;
p.Start();

var handle = p.MainWindowHandle;
SetWindowPos(handle, 0, -1000, -1000, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
最后一种方法适用于大多数情况,除非用于固定窗口(例如侧边栏)

有没有通用的方法来处理这个问题

任何帮助都将不胜感激,谢谢使用User32.dll

[DllImport("User32")] 
private static extern int ShowWindow(int hwnd, int nCmdShow);
上述函数接受2个参数,秒数具有以下值:

SW_HIDE             0
SW_SHOWNORMAL       1
SW_NORMAL           1
SW_SHOWMINIMIZED    2
SW_SHOWMAXIMIZED    3
SW_MAXIMIZE         3
SW_SHOWNOACTIVATE   4
SW_SHOW             5
SW_MINIMIZE         6
SW_SHOWMINNOACTIVE  7
SW_SHOWNA           8
SW_RESTORE          9
SW_SHOWDEFAULT      10
SW_FORCEMINIMIZE    11
SW_MAX              11
这样您就可以通过以下方式隐藏记事本:

int hWnd;
Process[] processRunning = Process.GetProcesses();
foreach (Process pr in processRunning)
{
    if (pr.ProcessName == "notepad")
    {
        hWnd = pr.MainWindowHandle.ToInt32();
        ShowWindow(hWnd, SW_HIDE);
    }
}
使用User32.dll

[DllImport("User32")] 
private static extern int ShowWindow(int hwnd, int nCmdShow);
上述函数接受2个参数,秒数具有以下值:

SW_HIDE             0
SW_SHOWNORMAL       1
SW_NORMAL           1
SW_SHOWMINIMIZED    2
SW_SHOWMAXIMIZED    3
SW_MAXIMIZE         3
SW_SHOWNOACTIVATE   4
SW_SHOW             5
SW_MINIMIZE         6
SW_SHOWMINNOACTIVE  7
SW_SHOWNA           8
SW_RESTORE          9
SW_SHOWDEFAULT      10
SW_FORCEMINIMIZE    11
SW_MAX              11
这样您就可以通过以下方式隐藏记事本:

int hWnd;
Process[] processRunning = Process.GetProcesses();
foreach (Process pr in processRunning)
{
    if (pr.ProcessName == "notepad")
    {
        hWnd = pr.MainWindowHandle.ToInt32();
        ShowWindow(hWnd, SW_HIDE);
    }
}

我用AHK库解决了我的问题


它为windows中的任务调度和自动化提供了多种功能。

我使用AHK库解决了我的问题



它为windows中的任务调度和自动化提供了多个功能。

您可以使用
process.getProcessByName()
而不是使用文件路径抓取进程,这在大多数情况下可能会更好。为什么要隐藏任意应用程序而不是最小化它?为什么要用完全不相关的标记重新标记问题?不要垃圾邮件标签。您不编写VBA或C++代码,这根本不与WiFrices有关,VisualStudio标签只用于VisualStudio的问题。我需要与应用程序按钮交互,因为我正在开发一个像封面一样的应用程序。在不接触原始图形源代码的情况下,使用新图形重新映射所有按钮app@Amy我修复了标记,你说得对。你可以使用
process.getProcessByName()
抓取一个进程,而不是使用文件路径,这在大多数情况下可能会更好。为什么要隐藏任意应用程序而不是最小化它?为什么要用完全不相关的标记重新标记问题?不要垃圾邮件标签。您不编写VBA或C++代码,这根本不与WiFrices有关,VisualStudio标签只用于VisualStudio的问题。我需要与应用程序按钮交互,因为我正在开发一个像封面一样的应用程序。在不接触原始图形源代码的情况下,使用新图形重新映射所有按钮app@Amy我修复了标记,你是对的。你可以使用标准的
ShowWindow(IntPtr hwnd,int nCmdShow)
并避免硬编码转换。这适用于除基于java的应用程序之外的多个应用程序。我有一个简单的Java应用程序,但它没有work@SimoneEsposito它是java程序的works事件,但您将它们视为java(.exe)或javaw(.exe)作为进程名,这取决于启动程序所使用的名称。我测试它,它工作。还要注意processname案例。@Cod3Flu3nc3很抱歉,我不明白。我应该注意什么?我将一个java应用程序编译为.jar,然后将其转换为.exe(当我试图直接设置.jar路径时,调试器给了我一个错误)。@Bileragger他说是的,它可以工作(我同意),并且必须以“javaw”为目标:而且(我认为)进程名称可能区分大小写。不是。但是,如果您以“javaw.exe”为目标,它将不起作用。您可以使用标准的
ShowWindow(IntPtr hwnd,int nCmdShow)
并避免硬编码转换。这适用于除基于java的应用程序之外的多个应用程序。我有一个简单的Java应用程序,但它没有work@SimoneEsposito它是java程序的works事件,但您将它们视为java(.exe)或javaw(.exe)作为进程名,这取决于启动程序所使用的名称。我测试它,它工作。还要注意processname案例。@Cod3Flu3nc3很抱歉,我不明白。我应该注意什么?我将一个java应用程序编译为.jar,然后将其转换为.exe(当我试图直接设置.jar路径时,调试器给了我一个错误)。@Bileragger他说是的,它可以工作(我同意),并且必须以“javaw”为目标:而且(我认为)进程名称可能区分大小写。不是。但是,如果您以“javaw.exe”为目标,它将无法工作。