通过代码在Windows 10上启用平板电脑模式?

gtlvzcf8  于 2023-11-21  发布在  Windows
关注(0)|答案(3)|浏览(314)

我已经阅读了各种方法来检测Windows 10设备是否处于平板电脑模式,最值得注意的是下面的主题;
How can I detect when Window 10 enters tablet mode in a Windows Forms application?
我想通过代码(.Net C#)启用/禁用平板电脑模式,但我找不到任何资源来实现这一点。我已经尝试更改注册表项并发送一个HWND_BROADCAST,说明发生了更改,但这不会启动到平板电脑模式的更改。
我也试过使用间谍++风格的应用程序,但看不到正在发送的消息。
有没有办法做到这一点?

zdwk9cvp

zdwk9cvp1#

在C#中没有真实的方法来做到这一点。当然你可以更改注册表项,但你将需要注销/登录来从或切换到平板电脑模式。

  1. HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ImmersiveShell\TabletMode

字符串
启用:1或禁用0
由于我有一个问题,我的WPF应用程序将不会出现在启动与平板电脑模式,我使用了AutoHotKey脚本。你可以创建一个.exe以及。来源:https://autohotkey.com/boards/viewtopic.php?t=15619

  1. #NoEnv
  2. SetBatchLines -1
  3. ListLines Off
  4. #NoTrayIcon
  5. TABLETMODESTATE_DESKTOPMODE := 0x0
  6. TABLETMODESTATE_TABLETMODE := 0x1
  7. TabletModeController_GetMode(TabletModeController, ByRef mode) {
  8. return DllCall(NumGet(NumGet(TabletModeController+0),3*A_PtrSize), "Ptr", TabletModeController, "UInt*", mode)
  9. }
  10. TabletModeController_SetMode(TabletModeController, _TABLETMODESTATE, _TMCTRIGGER := 4) {
  11. return DllCall(NumGet(NumGet(TabletModeController+0),4*A_PtrSize), "Ptr", TabletModeController, "UInt", _TABLETMODESTATE, "UInt", _TMCTRIGGER)
  12. }
  13. ImmersiveShell := ComObjCreate("{C2F03A33-21F5-47FA-B4BB-156362A2F239}", "{00000000-0000-0000-C000-000000000046}")
  14. TabletModeController := ComObjQuery(ImmersiveShell, "{4fda780a-acd2-41f7-b4f2-ebe674c9bf2a}", "{4fda780a-acd2-41f7-b4f2-ebe674c9bf2a}")
  15. if (TabletModeController_GetMode(TabletModeController, mode) == 0)
  16. TabletModeController_SetMode(TabletModeController, mode == TABLETMODESTATE_DESKTOPMODE ? TABLETMODESTATE_TABLETMODE : TABLETMODESTATE_DESKTOPMODE)
  17. ObjRelease(TabletModeController), TabletModeController := 0
  18. ObjRelease(ImmersiveShell), ImmersiveShell := 0 ; Can be freed after TabletModeController is created, instead

展开查看全部
ijxebb2r

ijxebb2r2#

here中浏览-您将希望关注用户交互模式的示例。
注意事项:这是UWP(通用Windows平台),又名Windows 10+,如果您不只针对Win 10,则需要其他版本的Windows代码。

bbuxkriu

bbuxkriu3#

基于j-krue的答案和AutoHotKey脚本。来源:https://autohotkey.com/boards/viewtopic.php?t=15619。以下代码在Windows 10中进行了测试,可以正常工作,无需重新登录或重新启动即可切换平板电脑模式。

  1. sruct ITabletModeController : IUnknown
  2. {
  3. virtual HRESULT STDMETHODCALLTYPE GetMode(int* piMode) = 0;
  4. virtual HRESULT STDMETHODCALLTYPE SetMode(int iMode, int iModeTrigger) = 0;
  5. };
  6. // IID_IServiceProvider: {6D5140C1-7436-11CE-8034-00AA006009FA}
  7. // CLSID_ImmersiveShell: {C2F03A33-21F5-47FA-B4BB-156362A2F239}
  8. DEFINE_GUID(CLSID_ImmersiveShell, 0xC2F03A33, 0x21F5, 0x47FA, 0xB4, 0xBB, 0x15, 0x63, 0x62, 0xA2, 0xF2, 0x39);
  9. DEFINE_GUID(IID_ITabletModeController, 0x4FDA780A, 0xACD2, 0x41F7, 0xB4, 0xF2, 0xEB, 0xE6, 0x74, 0xC9, 0xBF, 0x2A);
  10. static void EnableTabletMode(BOOL bEnable)
  11. {
  12. ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
  13. IServiceProvider* pServiceProvider = NULL;
  14. HRESULT hr = CoCreateInstance(CLSID_ImmersiveShell, NULL, CLSCTX_LOCAL_SERVER, IID_IServiceProvider, (PVOID*)&pServiceProvider);
  15. if (SUCCEEDED(hr))
  16. {
  17. ITabletModeController* pTabletController = NULL;
  18. hr = pServiceProvider->QueryService(IID_ITabletModeController, IID_ITabletModeController, (void**)&pTabletController);
  19. if (SUCCEEDED(hr) && pTabletController)
  20. {
  21. // iMode: 0 = Desktop, 1 = Tablet
  22. int iMode = -1;
  23. hr = pTabletController->GetMode(&iMode);
  24. int iToMode = bEnable ? 1 : 0;
  25. if (iMode != -1 && iMode != iToMode)
  26. {
  27. hr = pTabletController->SetMode(iToMode, 4);
  28. }
  29. pTabletController->Release();
  30. }
  31. pServiceProvider->Release();
  32. }
  33. ::CoUninitialize();
  34. }

字符串

展开查看全部

相关问题