以编程方式关闭Windows虚拟触摸板/轨迹板



我试图弄清楚如何通过C++/#或Windows脚本以编程方式启动Windows 10附带的新虚拟触摸板,它应该是一个通用Windows平台应用程序。

经过一些注册表黑客攻击,我发现我可以利用注册协议的启动行为来启动触摸板,比如:

"%SystemRoot%system32LaunchWinApp.exe" "ms-virtualtouchpad:"

我在这个钥匙上找到了这个信息:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREClassesms-virtualtouchpad]
@="URL:Virtual Touchpad"
"EditFlags"=dword:00200000
"URL Protocol"=""
[HKEY_LOCAL_MACHINESOFTWAREClassesms-virtualtouchpadShell]
[HKEY_LOCAL_MACHINESOFTWAREClassesms-virtualtouchpadShellOpen]
[HKEY_LOCAL_MACHINESOFTWAREClassesms-virtualtouchpadShellOpenCommand]
@=hex(2):22,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,
00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4c,00,
61,00,75,00,6e,00,63,00,68,00,57,00,69,00,6e,00,41,00,70,00,70,00,2e,00,65,
00,78,00,65,00,22,00,20,00,22,00,25,00,31,00,22,00,00,00
"DelegateExecute"="{54058896-4775-4C34-8B62-789FB2E263A4}"

(Default)值为REG_EXPAND_SZ:"%SystemRoot%system32LaunchWinApp.exe" "%1"

DelegateExecute与这个密钥有关:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTCLSID{54058896-4775-4C34-8B62-789FB2E263A4}]
@="VirtualTouchpadFlow Class"
[HKEY_CLASSES_ROOTCLSID{54058896-4775-4C34-8B62-789FB2E263A4}InProcServer32]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,
00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,00,77,00,
69,00,6e,00,75,00,69,00,2e,00,70,00,63,00,73,00,68,00,65,00,6c,00,6c,00,2e,
00,64,00,6c,00,6c,00,00,00
"ThreadingModel"="Both"

(Default)值为REG_EXPAND_SZ:%SystemRoot%system32twinui.pcshell.dll

因此,对于我的非UWP应用程序或脚本,我必须关闭它。然后问题就变成了关闭它。所以,如果它是一个UWP应用程序,我假设我需要让它处于挂起状态,或者以某种方式发送它终止。

我所能看到的关于LaunchWinApp的文档并不多,我也没有注意到任何类似于Close/Suspend/Terminate的名称。

我可以用另一种方式推出虚拟触摸板,但据我所知,目前还没有现成的问答;甚至以编程方式启动。

我应该如何继续?

这里有一个C++工作代码示例,用于为任何感兴趣的人切换打开和关闭触摸板。我相信你需要一个触摸屏才能让触摸板真正出现。我一直无法让它在我的无触摸桌面上工作。

#include <Windows.h>
#include <iostream>
int main()
{    
ShellExecute(0, 0, "ms-virtualtouchpad:", 0, 0, SW_HIDE);
Sleep(1500);
HWND uwp_wnd = HWND();
uwp_wnd = FindWindowEx(0, uwp_wnd, "ApplicationFrameWindow", 0);
if (uwp_wnd)
{
HWND tpad_wnd = HWND();
tpad_wnd = FindWindowEx(uwp_wnd, tpad_wnd, "Windows.UI.Core.CoreWindow", "Windows Shell Experience Host");
if (tpad_wnd != 0)
{
SendMessage(tpad_wnd, WM_CLOSE, 0, 0);
return 0;
}
}
return 1;
}

@KayleeFrye_onDeck,很抱歉回复延迟。

最后我可以启动msvirtualtouchpad了。原因是我的设备运行在x64操作系统上,我的x86程序应该访问C:WindowsSysnative下的LaunchWinApp.exe,而不是这里所说的C:WindowsSystem32。这样就行了!感谢您事先的研究!

最新更新