我的 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 也没有帮助:)
好吧,我将其作为答案发布,因为我认为评论太多了。如果与问题无关,请评论,以便我删除它。我没有
Lenovo Yoga 7i
,但我的 Acer Travelmate Spin
也有平板电脑模式。
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
发送消息超时
敞篷车晚期模式
使用上面的答案,我执行了以下步骤:
首先,从开始菜单打开记事本并粘贴以下代码:
# 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。 单击“下一步”,为快捷方式命名,然后保存。现在,您可以随时双击该快捷方式从桌面模式切换到平板电脑模式,反之亦然。