[英]Stop a process from showing a window from C#
我正在嘗試自動化在啟動時創建GUI窗口但沒有用戶交互的應用程序,但我無法弄清楚如何隱藏實際窗口。
我嘗試過使用ProcessStartInfo:
Process.Start(new ProcessStartInfo {
UseShellExecute = false,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
// other properties here
});
但窗口仍然顯示出來。
我也試過旋轉等待窗口存在,然后隱藏它:
while (process.MainWindowHandle == IntPtr.Zero) {}
ShowWindowAsync(process.MainWindowHandle, SW_HIDE);
遺憾的是,這使得窗口閃爍大約1/16秒左右,如果可能的話,我想避免使用它。
我目前的想法是創建一個鈎子 ,但我不確定抓什么鈎子,也不確定它是否會起作用。
有小費嗎?
所需的進程窗口樣式(實際映射到其中一個SW_
常量)被傳遞給另一個應用程序的WinMain
函數,但這並不意味着粗魯的應用程序不會忽略您發送的任何值。
您可以使用User32.CreateDesktop
創建另一個虛擬桌面來User32.CreateDesktop
,然后使用Kernel32.CreateProcess
,確保將正確的桌面名稱作為STARTINFO
結構的一部分STARTINFO
。
CreateNoWindow選項僅適用於控制台模式應用程序,您無法阻止GUI應用程序創建其主窗口。 最好的選擇是WindowStyle屬性,將其設置為Hidden或Minimized。 一個表現良好的GUI應用程序在調用ShowWindow()時使用它。 但它超越或忽略這個價值肯定並不罕見。 在你的情況下賠率並不好,最小化是你剩下要嘗試的。
使用UseShellExecute = true和WindowStyle = ProcessWindowStyle.Hidden嘗試選項1或不設置UseShellExecute(默認為true)
為什么不設置WinForm項目的Startup Object屬性? 您可以在不顯示表單或實際窗口的情況下啟動該過程。
static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Application.Run(new Form1());
// TODO: Start you process here?
}
希望這有幫助,謝謝。
你可以覆蓋整個表單區域的桌面內容中的表單Paint和blit,以便超過16秒嗎?
我是低級勝利形式的相對新手,但我最近只是在OnPaint玩,所以我想到了這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.