最近遇到一个需要将WPF窗体一直置顶的需求
试验了一种方案,记录一下
wpf窗体的句柄获取方式,在window窗体load事件中获取窗体句柄,供下面调用windowAPI使用
IntPtr handle;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WindowInteropHelper wndHelper = new WindowInteropHelper(this);
handle = wndHelper.Handle;
}
有了窗口句柄接下来就是调用API,搞个线程,每隔500ms设置一下窗体置顶, 试验了一下SWP_NOMOVE, SWP_SHOWWINDOW单独使用这两个参数就可以
[DllImport("user32.dll")]
private static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
const int SWP_SHOWWINDOW = 0x0040;
const int SWP_NOMOVE = 0x2;
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
new Thread(()=> {
while(true)
{
Thread.Sleep(500);
Application.Current.Dispatcher.Invoke(()=> {
SetWindowPos(handle, HWND_TOPMOST, 0, 0, 500, 500, SWP_SHOWWINDOW);
});
}
}).Start();
这么干以后,你的窗体就一直在最上面。使用的话尽量不要窗体里干太多事,否则可能稍稍影响性能