• 让你的WinForm不会在ALT+TAB中出现


    问题是这样的:

      我有个程序有个置顶的小提示窗口。然后,在使用ALT+TAB切换窗口时老是会不小心切换到这个提示窗口(和我的本意不符合的),很烦人。

    如何解决:

      也就是说:如何让WinForm不会在ALT+TAB中出现?

      学过Win32窗口编程的都知道:Windows窗口的显示样式主要由创建窗口(CreateWindowEx)时dwExStyle和dwStyle两种样式决定。(WinForm最终还是用API创建窗口的)

      其中,dwExStyle中WS_EX_TOOLWINDOW正是我们需要的样式,它表示工具窗口,是不会在ALT+TAB中显示的。

    如何更改dwExStyle样式呢?

      首先想到的是改变CreateWindowEx中的dwExStyle参数。具体而言,WinForm中有个属性CreateParams可以更改:

    CreateParams.ExStyle = CreateParams.ExStyle | Win32Native.WS_EX_TOOLWINDOW;
    

      似乎,这条语句应该在WinForm创建前执行,但是有个问题是WinForm相关联的句柄创建的很早,即使你把这一句放到构造函数的最开始部分,结果也不能更改窗体样式。  还有没有其他办法呢?那只能在WinForm窗体创建后更改dwExStyle样式了。还好,API中有Get/SetWindowLong函数可以用来对已创建的窗口的相关信息进行更改。具体做法如下:

    
    
            [DllImport("user32.dll")]
            public static extern
                Int32 GetWindowLong(IntPtr hwnd, Int32 index);
            [DllImport("user32.dll")]
            public static extern
                Int32 SetWindowLong(IntPtr hwnd, Int32 index, Int32 newValue);
            public const int GWL_EXSTYLE = (-20);
            public static void AddWindowExStyle(IntPtr hwnd,Int32 val)
            {
                int oldValue = GetWindowLong(hwnd,GWL_EXSTYLE);
                if (oldValue == 0)
                {
                    throw new System.ComponentModel.Win32Exception();
                }
                if (0 == SetWindowLong(hwnd, GWL_EXSTYLE, oldValue | val))
                {
                    throw new System.ComponentModel.Win32Exception();
                }
            }
            public static int WS_EX_TOOLWINDOW = 0x00000080;
            //我把这个过程封装下:
            public static void SetFormToolWindowStyle(System.Windows.Forms.Form form)
            {
                AddWindowExStyle(form.Handle, WS_EX_TOOLWINDOW);
            }
    
    
    

      如此这般,对一个WinForm调用SetFormToolWindowStyle就行了。

    需要注意的是:

      WS_EX_TOOLWINDOW和WS_EX_APPWINDOW(对应WinForm中ShowInTaskBar)是会冲突的。

      如果,这个窗口是APPWINDOW,那么还需要将ShowInTaskBar属性设为false.

  • 相关阅读:
    本地部署到服务器并且访问的地址,修改Tomcat服务器端口为80。
    使用流读取文件内容[IO流经典代码]
    SQL语句执行顺序
    集合问题
    同步和异步
    CSS3新特性
    创建表DDL 、增删改DML、DQL查询操作
    Git讲义
    SpringData讲义
    JPA---Java持久层API
  • 原文地址:https://www.cnblogs.com/pcy0/p/1775108.html
Copyright © 2020-2023  润新知