簡體   English   中英

停止進程從C#顯示一個窗口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM