在wpf中,我如何防止用户通过拖动标题栏来移动窗口?
wz3gfoph1#
由于不能在WPF中直接定义WndProc,因此需要获取HwndSource,并为其添加钩子:
WndProc
HwndSource
public Window1() { InitializeComponent(); this.SourceInitialized += Window1_SourceInitialized; } private void Window1_SourceInitialized(object sender, EventArgs e) { WindowInteropHelper helper = new WindowInteropHelper(this); HwndSource source = HwndSource.FromHwnd(helper.Handle); source.AddHook(WndProc); } const int WM_SYSCOMMAND = 0x0112; const int SC_MOVE = 0xF010; private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch(msg) { case WM_SYSCOMMAND: int command = wParam.ToInt32() & 0xfff0; if (command == SC_MOVE) { handled = true; } break; default: break; } return IntPtr.Zero; }
t5zmwmid2#
非常古老的线程和其他技术,如UWP和WinUI3,但也许我的建议对其他人有帮助。我通过设定来达到目标
WindowStyle="None"
在窗口中添加一个按钮并设置
IsCancel="True"
就这样。不需要互操作代码。最小化代码。
axr492tv3#
我知道这是一篇老文章,但…你仍然可以用Alt+space+m -->任何箭头-->鼠标或其他箭头来移动它,这也是我目前试图禁用的。我的应用程序在Kiosk上运行,应该一直保持打开状态。我使用WPF。防止接近很容易,移动...就不那么容易了。
3条答案
按热度按时间wz3gfoph1#
由于不能在WPF中直接定义
WndProc
,因此需要获取HwndSource
,并为其添加钩子:t5zmwmid2#
非常古老的线程和其他技术,如UWP和WinUI3,但也许我的建议对其他人有帮助。
我通过设定来达到目标
在窗口中添加一个按钮并设置
就这样。不需要互操作代码。最小化代码。
axr492tv3#
我知道这是一篇老文章,但…你仍然可以用Alt+space+m -->任何箭头-->鼠标或其他箭头来移动它,这也是我目前试图禁用的。我的应用程序在Kiosk上运行,应该一直保持打开状态。我使用WPF。防止接近很容易,移动...就不那么容易了。