C#应用程序推迟Win7切换用户

时间:2010-10-25 06:47:23

标签: c# winapi

我有一个C#应用程序,我希望我的应用程序通过MessageBox推迟Windows Switch用户并等待来自MessageBox的响应。如果我的应用程序还没有为Switch User做好准备,那么我取消Windows Switch用户。

我尝试过WTSRegisterSessionNotification()并在方法WndProc()中接收WM_WTSSESSION_CHANGE消息,如下所示:

[DllImport("WtsApi32.dll")]
public static extern bool WTSRegisterSessionNotification(IntPtr hWnd, [MarshalAs(UnmanagedType.U4)]int dwFlags);

[DllImport("WtsApi32.dll")]
public static extern bool WTSUnRegisterSessionNotification(IntPtr hWnd);

WTSRegisterSessionNotification(this.Handle, 1); // all sessions

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case Unmanaged.Constants.WM_WTSSESSION_CHANGE: // 0x02B1
            {
                try
                {
                    int wParamValue = m.WParam.ToInt32();
                    File.AppendAllText(@"d:\temp\logoff.txt", wParamValue.ToString());

                    if (wParamValue == Unmanaged.Constants.SESSION_LOCK)// SESSION_LOCK = 0x7;
                    {
                        DialogResult dialogResult = MessageBox.Show(this, 
                            "Do you really want to switch user?",
                            "title", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                        if (dialogResult == DialogResult.No)
                        {
                            // cancel switch user
                            return;
                        }
                    }
                }
                catch (Exception exc)
                {
                    break;
                }
                break;
            }
    }

    base.WndProc(ref m);
}

我的问题:

    WndProc()中的
  1. :当我切换用户时,wParamValue的值只有1或2。它应该是MSDN提到的0x7。
  2. 我收到了WM_WTSSESSION_CHANGE消息,但Windows仍然是Switch User(MessageBox未显示)。在Windows切换用户之后似乎发送了WM_WTSSESSION_CHANGE。
  3. 是否有推迟和取消Windows Switch用户的解决方案?

    谢谢, 顺

1 个答案:

答案 0 :(得分:1)

正如MSDN所提到的,此消息是为方便起见而在操作后发送的通知消息,而不是提前发送,以防止它发生。

阻止用户进行切换对我来说似乎是明显的恶意,我会惊讶地知道Windows支持的形式不是组策略。 Windows团队以艰难的方式吸取了教训。 You can't even cancel system stand by mode因为该功能被滥用了很多。