C# 在windows中隐藏任何应用程序
我正在开发一个以编程方式隐藏外部进程窗口的应用程序,我尝试了几种技术,但它们似乎都不能与任何应用程序正常工作。例如,我成功地隐藏了notepad.exe,但当我试图隐藏基于java的应用程序时,什么也没有发生 下面是我使用的一些代码示例: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;
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”为目标,它将无法工作。