Windows 通過編輯注冊(cè)表設(shè)置左右手使用習(xí)慣更改 Popup 彈出位置
本文告訴大家如何在通過更改注冊(cè)表的設(shè)置,從而更改平板電腦設(shè)置 Tablet PC Settings 的左右手使用習(xí)慣 Handedness 的慣用左手和慣用右手選項(xiàng)
博客園只做備份,文章發(fā)布了就極少更新,還請(qǐng)到我的主站閱讀原文,避免獲取到陳舊知識(shí)內(nèi)容: https://blog.lindexi.com/post/Windows-通過編輯注冊(cè)表設(shè)置左右手使用習(xí)慣更改-Popup-彈出位置.html
在用戶端,可以通過在運(yùn)行里面,輸入 shell:::{80F3F1D5-FECA-45F3-BC32-752C152E456E} 按下回車,可以進(jìn)入平板電腦設(shè)置界面,中文版和英文版界面分別如下


這個(gè)選項(xiàng)將會(huì)影響 WPF 的 Popup 彈出的默認(rèn)方向位置,以及所有的菜單的彈出方向位置
設(shè)置慣用左手時(shí)的 Popup 彈出行為如下:

設(shè)置慣用右手時(shí)的 Popup 彈出行為如下:

通過注冊(cè)表修改設(shè)置的方式是在運(yùn)行里輸入 regedit 打開注冊(cè)表編輯,進(jìn)入 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows 路徑,修改 MenuDropAlignment 選項(xiàng)。默認(rèn)的 MenuDropAlignment 選項(xiàng)是 0 的值,不同的值對(duì)應(yīng)如下
- 0 : 默認(rèn)值,慣用左手
- 1 : 慣用右手
可通過更改 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\MenuDropAlignment 項(xiàng)從而修改用戶設(shè)置,修改之后,需要重啟才能生效
在 WPF 忽略此屬性影響,可以使用如下方法
public static class PopupHacks
{
private static FieldInfo? _menuDropAlignmentField;
/// <summary>
/// 禁用系統(tǒng)的菜單彈出方向設(shè)置,取消對(duì)應(yīng)用程序的Popup彈出方向的影響
/// </summary>
public static void DisableSystemMenuPopupAlignment()
{
_menuDropAlignmentField = typeof(SystemParameters).GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static);
System.Diagnostics.Debug.Assert(_menuDropAlignmentField != null);
EnsureStandardPopupAlignment();
SystemParameters.StaticPropertyChanged -= SystemParameters_StaticPropertyChanged;
SystemParameters.StaticPropertyChanged += SystemParameters_StaticPropertyChanged;
}
private static void SystemParameters_StaticPropertyChanged(object? sender, PropertyChangedEventArgs e)
{
EnsureStandardPopupAlignment();
}
private static void EnsureStandardPopupAlignment()
{
if (SystemParameters.MenuDropAlignment)
{
_menuDropAlignmentField?.SetValue(null, false);
}
}
}
更多請(qǐng)看 Popup element are reversed left and right in Windows 11 · Issue #5944 · dotnet/wpf
由于這個(gè)功能的入口在 Win11 里完全被干掉了。且即使注冊(cè)表更改了,整個(gè)系統(tǒng)應(yīng)用、甚至包括記事本等應(yīng)用,再也不聽這個(gè)設(shè)置了。我認(rèn)為在 WPF 里面遵守這個(gè)規(guī)則只會(huì)坑到開發(fā)者,不如就廢棄此功能。我給 WPF 寫了一個(gè)提案,如果大家認(rèn)同的話,還請(qǐng)幫我點(diǎn)一個(gè)贊支持一下,詳細(xì)請(qǐng)看 https://github.com/dotnet/wpf/issues/11073
博客園博客只做備份,博客發(fā)布就不再更新,如果想看最新博客,請(qǐng)?jiān)L問 https://blog.lindexi.com/
如圖片看不見,請(qǐng)?jiān)跒g覽器開啟不安全http內(nèi)容兼容

本作品采用知識(shí)共享署名-非商業(yè)性使用-相同方式共享 4.0 國(guó)際許可協(xié)議進(jìn)行許可。歡迎轉(zhuǎn)載、使用、重新發(fā)布,但務(wù)必保留文章署名[林德熙](http://www.rzrgm.cn/lindexi)(包含鏈接:http://www.rzrgm.cn/lindexi ),不得用于商業(yè)目的,基于本文修改后的作品務(wù)必以相同的許可發(fā)布。如有任何疑問,請(qǐng)與我[聯(lián)系](mailto:lindexi_gd@163.com)。

浙公網(wǎng)安備 33010602011771號(hào)