好的,我发表这篇回答是因为我认为它对于评论来说太多了。如果它与问题无关,请在评论中指出,以便我可以删除它。我没有Lenovo Yoga 7i
,但我的Acer Travelmate Spin
也有平板模式。
根据GetSystemMetrics GetSystemMetrics(SM_CONVERTIBLESLATEMODE); // 0x2003
,我们似乎能够读取我们是否处于平板模式0
或1
,其中平板0=平板电脑
,平板1=笔记本电脑或其他设备
,根据convertibleslatemode。
文档声称:
反映笔记本电脑或平板模式的状态,0表示平板模式,非零表示其他模式。当系统度量值发生变化时,系统通过WM_SETTINGCHANGE发送广播消息,LPARAM中包含"ConvertibleSlateMode"。请注意,此系统度量值不适用于台式电脑。在这种情况下,请使用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和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";
}
然后在主函数中:
int main() {
setRegKey(0);
setRegKey(1);
}
编辑:如@BenVoigt和@KeshavV所提到的,您很可能也可以按照以下步骤操作:Windows 10平板模式注册表设置:“当此设备自动切换平板模式开启或关闭”
更多相关链接:
GetSystemMetrics
WM_SETTINGCHANGE
SendMessageTimeout
convertibleslatemode