微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从Windows窗体C#启动进程而不创建任务栏图标

如何解决如何从Windows窗体C#启动进程而不创建任务栏图标

我有一个Windows Forms应用程序,该应用程序带有一个应该打开exe文件的按钮。

Windows的认行为是exe文件一旦打开,将在任务栏中显示其自己的图标,但是要求它不要具有该图标,并且窗口必须在图标内“嵌套”显示源于它的Windows Form应用程序,以便向用户隐藏exe文件的位置。

我一直在寻找解决方案,我的理解是,要实现此目的,我必须使用user32.dll库。

我在网上找到了一些尝试执行类似操作的代码(没有窗口,没有任务栏图标),并且我正在尝试对其进行调整,以使其适合我的需求,但到目前为止,我仍然受困。

这就是我所拥有的:

    private int    GWL_STYLE        = -16;
    private int    GWL_EXSTYLE      = -20;
    private int    WS_EX_APPWINDOW  = 262144;
    private UInt32 WS_POPUP         = 0x80000000;
    private UInt32 WS_CHILD         = 0x40000000;


    [DllImport("user32.dll")]
    private static extern int getwindowlong(IntPtr hWnd,int nIndex);

    [DllImport("user32.dll")]
    private static extern int SetwindowLong(IntPtr hWnd,int nIndex,int dwNewLong);

    [DllImport("user32.dll",SetLastError = true)]
    private static extern IntPtr SetParent(IntPtr hWndChild,IntPtr hWndNewParent);

    public Process HideProcess(string executablesPath,System.Windows.Forms.Form parentForm) {
        Process valuetoReturn = null;
        if (executablesPath != null && executablesPath.Equals(String.Empty) == false && File.Exists(executablesPath) == true) {
            processstartinfo startInfo = new processstartinfo(executablesPath);
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            valuetoReturn = Process.Start(startInfo);

            int style = getwindowlong(valuetoReturn.MainWindowHandle,GWL_EXSTYLE) & ~WS_EX_APPWINDOW;
            SetwindowLong(valuetoReturn.MainWindowHandle,GWL_EXSTYLE,style);
            SetParent(valuetoReturn.MainWindowHandle,parentForm.Handle);
        }
        return valuetoReturn;
    }

我已经尝试了这种方法的几种不同变体,但是我总是很接近,但不完全是我想要的位置。 我发现的文档似乎有些混乱,因此我有些困惑,不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。