如何以编程方式将 Windows 11 22H2 从平板电脑模式切换到桌面模式?

问题描述 投票:0回答:2

我的 Lenovo Yoga 7i 笔记本电脑默认以平板电脑模式启动,因此我最终会看到较大的桌面/任务栏图标和其他令人不快的 UI 工件。

可以通过安装和运行

Lenovo Yoga Mode Control for Windows
来解决此问题,这是一项 Lenovo 专有服务 (
YMC.EXE
),因其过高的 CPU 使用率而臭名昭著。

就我而言,YMC 在 Windows 服务管理器中设置为

Manual
。要让 Windows 返回桌面模式,我必须从管理控制台手动启动和停止 YMC:每次系统重新启动时
net start ymc && net stop ymc

我正在寻找一种编程方法来完成 YMC 所做的一切,将 Windows 11 切换到桌面模式。,将其包装为一个小型实用程序应用程序。

到目前为止我找到的唯一相关答案是这个,提到了未记录的

ITabletModeController

var pSP = (IServiceProvider)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_ImmersiveShell));
var pTMC = (ITabletModeController)pSP.QueryService(typeof(ITabletModeController).GUID, typeof(ITabletModeController).GUID);
if (pTMC != null)
{
    // 0 = Desktop, 1 = Tablet
    int nMode = 0;
    int nRet = pTMC.GetMode(ref nMode);
    nRet = pTMC.SetMode(nMode==0?1:0, 4);
}

我试过了,没有效果。 ChatGPT 也没有帮助:)

c# c++ .net windows winapi
2个回答
3
投票

好吧,我将其作为答案发布,因为我认为评论太多了。如果与问题无关,请评论,以便我删除它。我没有

Lenovo Yoga 7i
,但我的
Acer Travelmate Spin
也有平板电脑模式。

根据 GetSystemMetrics

GetSystemMetrics(SM_CONVERTIBLESLATEMODE); // 0x2003 
,如果我们处于平板模式 0
1
,则我们似乎能够
阅读
,其中
slate 0 = tablet
slate 1 = laptop or other devices
根据 convertibleslatemode

文档声称:

反映笔记本电脑或平板模式的状态,0 表示平板模式, 否则非零。当该系统指标发生变化时,系统发送 通过带有“ConvertibleSlateMode”的 WM_SETTINGCHANGE 的广播消息 在 LPARAM 中。请注意,此系统指标不适用于桌面设备 件。在这种情况下,请使用 GetAutoRotationState。

我尝试通过以下方式自己进行此广播:

DWORD_PTR res;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) L"ConvertibleSlateMode", SMTO_ABORTIFHUNG, 1000, &res);

这不起作用。

然后我意识到有一个名为

Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\PriorityControl
的注册表项位于:
ConvertibleSlateMode
,它反映了之前提到的
slate 0 and 1
的值。

如果您处于平板电脑模式 (

slate 0
) 并将 regkey 的值设置为 1,则会进入桌面模式。我不确定是否需要广播(上面提到的),但对我来说,它可以(在平板电脑模式下)将 regkey 设置为 0,然后设置为 1。

在 C++ 中,这可以通过以下方式完成:

void setRegKey(const DWORD value) {
    HKEY hKey;
    LONG regStatus = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\PriorityControl", 0, KEY_SET_VALUE, &hKey);

    if (regStatus != ERROR_SUCCESS) {
        std::cout << "Error opening registry key.\n";
        return;
    }

    const wchar_t* valueName = L"ConvertibleSlateMode";


    regStatus = RegSetValueExW(hKey, valueName, 0, REG_DWORD, (BYTE*)&value, sizeof(DWORD));

    if (regStatus != ERROR_SUCCESS) {
        std::cout << "Error setting registry value.\n";
        RegCloseKey(hKey);
        return;
    }

    RegCloseKey(hKey);

    std::cout << "Registry value set successfully.\n";
}

然后在main中:

int main() {
    setRegKey(0);
    setRegKey(1);
}

编辑: 正如@BenVoigt 和@KeshavV 所提到的。您很可能也可以按照以下步骤操作:Windows 10 平板电脑模式注册表设置:“当此设备自动打开或关闭平板电脑模式时”

更多相关链接:
获取系统指标
WM_SETTINGCHANGE
发送消息超时
敞篷车晚期模式


0
投票

使用上面的答案,我执行了以下步骤:

首先,从开始菜单打开记事本并粘贴以下代码:

# Define the registry path and value
$registryPath = "HKLM:\SYSTEM\CurrentControlSet\Control\PriorityControl"
$registryName = "ConvertibleSlateMode"

# Check if the registry path exists
if (Test-Path $registryPath) {
    # Get the current value of the registry key
    $currentValue = Get-ItemProperty -Path $registryPath | Select-Object -ExpandProperty $registryName
    
    # Check the current value and set the new value accordingly
    if ($currentValue -eq 0) {
        $newValue = 1
    }
    elseif ($currentValue -eq 1) {
        $newValue = 0
    }
    else {
        Write-Host "Invalid value detected: $currentValue"
        exit
    }

    # Set the registry value
    Set-ItemProperty -Path $registryPath -Name $registryName -Value $newValue -Type DWORD -Force
    Write-Host "Registry key '$registryName' set to $newValue successfully."
} else {
    Write-Host "Registry path '$registryPath' does not exist."
}

将文件保存在某个位置,文件名为 tablet_mode.ps1(提示:将“保存类型”更改为“所有文件”)。保存后,右键单击该文件,然后单击“复制为路径”。右键单击桌面上的任何空白区域并创建一个新的快捷方式。对于快捷方式的位置,请输入以下内容:

powershell.exe -Command "& {$wd = Get-Location; Start-Process powershell.exe -Verb RunAs -ArgumentList \"-ExecutionPolicy ByPass -Command Set-Location $wd; path_to_file\tablet_mode.ps1\"}"

"path_to_fileablet_mode.ps1" 替换为上面复制的实际文件路径。 例如C:\users\dummyuser\desktopablet.mode.ps1。 单击“下一步”,为快捷方式命名,然后保存。现在,您可以随时双击该快捷方式从桌面模式切换到平板电脑模式,反之亦然。

© www.soinside.com 2019 - 2024. All rights reserved.