none
如何让窗口不获得焦点? RRS feed

  • 问题

  • Winform我一般让一个窗口显示出来,调用Show函数。该窗口肯定是获得焦点的

    如何让一个窗口显示出来后,该窗口是不获得焦点的,就像QQ右下角的提示。


    2012年12月6日 0:26

答案

  • Hi Male, 

    试试这个API: http://msdn.microsoft.com/ZH-CN/library/windows/desktop/ms633548(v=vs.85).aspx 

    以下是测试代码,其中testForm就是一个VS创建的默认的form:

        public partial class ShowNoActiveForm : Form
        {
            public ShowNoActiveForm()
            {
                InitializeComponent();
            }
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);
    
            enum ShowWindowCommands : int
            {
                /// <summary>
                /// Hides the window and activates another window.
                /// </summary>
                Hide = 0,
                /// <summary>
                /// Activates and displays a window. If the window is minimized or 
                /// maximized, the system restores it to its original size and position.
                /// An application should specify this flag when displaying the window 
                /// for the first time.
                /// </summary>
                Normal = 1,
                /// <summary>
                /// Activates the window and displays it as a minimized window.
                /// </summary>
                ShowMinimized = 2,
                /// <summary>
                /// Maximizes the specified window.
                /// </summary>
                Maximize = 3, // is this the right value?
                /// <summary>
                /// Activates the window and displays it as a maximized window.
                /// </summary>       
                ShowMaximized = 3,
                /// <summary>
                /// Displays a window in its most recent size and position. This value 
                /// is similar to <see cref="Win32.ShowWindowCommand.Normal"/>, except 
                /// the window is not activated.
                /// </summary>
                ShowNoActivate = 4,
                /// <summary>
                /// Activates the window and displays it in its current size and position. 
                /// </summary>
                Show = 5,
                /// <summary>
                /// Minimizes the specified window and activates the next top-level 
                /// window in the Z order.
                /// </summary>
                Minimize = 6,
                /// <summary>
                /// Displays the window as a minimized window. This value is similar to
                /// <see cref="Win32.ShowWindowCommand.ShowMinimized"/>, except the 
                /// window is not activated.
                /// </summary>
                ShowMinNoActive = 7,
                /// <summary>
                /// Displays the window in its current size and position. This value is 
                /// similar to <see cref="Win32.ShowWindowCommand.Show"/>, except the 
                /// window is not activated.
                /// </summary>
                ShowNA = 8,
                /// <summary>
                /// Activates and displays the window. If the window is minimized or 
                /// maximized, the system restores it to its original size and position. 
                /// An application should specify this flag when restoring a minimized window.
                /// </summary>
                Restore = 9,
                /// <summary>
                /// Sets the show state based on the SW_* value specified in the 
                /// STARTUPINFO structure passed to the CreateProcess function by the 
                /// program that started the application.
                /// </summary>
                ShowDefault = 10,
                /// <summary>
                ///  <b>Windows 2000/XP:</b> Minimizes a window, even if the thread 
                /// that owns the window is not responding. This flag should only be 
                /// used when minimizing windows from a different thread.
                /// </summary>
                ForceMinimize = 11
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                TestForm f = new TestForm();
                ShowWindow(f.Handle, ShowWindowCommands.ShowNoActivate);
    
            }
        }

    希望有用。


    Mike Feng
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月6日 10:57
    版主
  • 是在最前端的:

    另外你也可以设置下这个属性: http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.topmost(v=vs.110).aspx


    Mike Feng
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    • 已编辑 Mike FengModerator 2012年12月7日 6:10
    • 已标记为答案 male110 2012年12月7日 6:35
    • 取消答案标记 male110 2012年12月10日 0:39
    • 已标记为答案 male110 2012年12月10日 1:10
    2012年12月7日 6:09
    版主

全部回复

  • Hi Male, 

    试试这个API: http://msdn.microsoft.com/ZH-CN/library/windows/desktop/ms633548(v=vs.85).aspx 

    以下是测试代码,其中testForm就是一个VS创建的默认的form:

        public partial class ShowNoActiveForm : Form
        {
            public ShowNoActiveForm()
            {
                InitializeComponent();
            }
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);
    
            enum ShowWindowCommands : int
            {
                /// <summary>
                /// Hides the window and activates another window.
                /// </summary>
                Hide = 0,
                /// <summary>
                /// Activates and displays a window. If the window is minimized or 
                /// maximized, the system restores it to its original size and position.
                /// An application should specify this flag when displaying the window 
                /// for the first time.
                /// </summary>
                Normal = 1,
                /// <summary>
                /// Activates the window and displays it as a minimized window.
                /// </summary>
                ShowMinimized = 2,
                /// <summary>
                /// Maximizes the specified window.
                /// </summary>
                Maximize = 3, // is this the right value?
                /// <summary>
                /// Activates the window and displays it as a maximized window.
                /// </summary>       
                ShowMaximized = 3,
                /// <summary>
                /// Displays a window in its most recent size and position. This value 
                /// is similar to <see cref="Win32.ShowWindowCommand.Normal"/>, except 
                /// the window is not activated.
                /// </summary>
                ShowNoActivate = 4,
                /// <summary>
                /// Activates the window and displays it in its current size and position. 
                /// </summary>
                Show = 5,
                /// <summary>
                /// Minimizes the specified window and activates the next top-level 
                /// window in the Z order.
                /// </summary>
                Minimize = 6,
                /// <summary>
                /// Displays the window as a minimized window. This value is similar to
                /// <see cref="Win32.ShowWindowCommand.ShowMinimized"/>, except the 
                /// window is not activated.
                /// </summary>
                ShowMinNoActive = 7,
                /// <summary>
                /// Displays the window in its current size and position. This value is 
                /// similar to <see cref="Win32.ShowWindowCommand.Show"/>, except the 
                /// window is not activated.
                /// </summary>
                ShowNA = 8,
                /// <summary>
                /// Activates and displays the window. If the window is minimized or 
                /// maximized, the system restores it to its original size and position. 
                /// An application should specify this flag when restoring a minimized window.
                /// </summary>
                Restore = 9,
                /// <summary>
                /// Sets the show state based on the SW_* value specified in the 
                /// STARTUPINFO structure passed to the CreateProcess function by the 
                /// program that started the application.
                /// </summary>
                ShowDefault = 10,
                /// <summary>
                ///  <b>Windows 2000/XP:</b> Minimizes a window, even if the thread 
                /// that owns the window is not responding. This flag should only be 
                /// used when minimizing windows from a different thread.
                /// </summary>
                ForceMinimize = 11
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                TestForm f = new TestForm();
                ShowWindow(f.Handle, ShowWindowCommands.ShowNoActivate);
    
            }
        }

    希望有用。


    Mike Feng
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月6日 10:57
    版主
  • 但他又要是最前端的。

       ShowWindow(f.Handle, ShowWindowCommands.ShowNoActivate);

    是被其它窗口挡住的。


    2012年12月7日 2:27
  • 是在最前端的:

    另外你也可以设置下这个属性: http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.topmost(v=vs.110).aspx


    Mike Feng
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    • 已编辑 Mike FengModerator 2012年12月7日 6:10
    • 已标记为答案 male110 2012年12月7日 6:35
    • 取消答案标记 male110 2012年12月10日 0:39
    • 已标记为答案 male110 2012年12月10日 1:10
    2012年12月7日 6:09
    版主