【问题标题】:WndProc in RadWindow WPFRadWindow WPF 中的 WndProc
【发布时间】:2019-02-22 21:29:31
【问题描述】:

我正在尝试在我的 WPF 应用程序中检测 Windows LogOff 或 Shutdown。有人可以帮忙吗?

xaml.cs

private static int WM_QUERYENDSESSION = 0x11;
private static bool systemShutdown = false;
public static event Microsoft.Win32.SessionEndingEventHandler SessionEnding;

protected virtual void WndProc(ref System.Windows.Forms.Message m)
{
    if (m.Msg == WM_QUERYENDSESSION)
    {
        MessageBox.Show("queryendsession: this is a logoff, shutdown, or reboot");
        systemShutdown = true;
    }

    // If this is WM_QUERYENDSESSION, the closing event should be  
    // raised in the base WndProc.  
    base.WndProc(ref m);  //Error

} //WndProc

错误:RadWindow 不包含“WndProc”的定义

【问题讨论】:

标签: c# wpf telerik


【解决方案1】:

一旦您的RadWindow 被加载,您应该能够获得对父 WPF 窗口的引用并创建一个 Win32 挂钩:

public class MyRadWindow : RadWindow
{
    public MyRadWindow()
    {
        Loaded += MyRadWindow_Loaded;
    }

    private void MyRadWindow_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        System.Windows.Window wpfWindow = this.ParentOfType<System.Windows.Window>();
        HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(wpfWindow).Handle);
        source.AddHook(new HwndSourceHook(WndProc));
    }

    private const int WM_QUERYENDSESSION = 0x11;
    private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == WM_QUERYENDSESSION)
        {
            //...
        }

        return IntPtr.Zero;
    }

    ...
}

【讨论】:

  • 太棒了!!!是的,这对我有用。一件事是,事件会同时触发 Shutdown 和 Cancel。反正有没有只为了关机而开火?此外,我需要以 MVVM 方式完成此操作。你能帮忙吗?
  • @iamCR:如果您还有其他问题,请提出一个新问题。您最初的问题是关于如何检测 RadWindow 中的事件,仅此而已。
猜你喜欢
  • 2012-07-31
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 2019-01-30
相关资源
最近更新 更多