Программное отключение виртуальной сенсорной панели/трекпада Windows

Я пытался выяснить, как программно с помощью сценариев C++/# или Windows запустить новую виртуальную сенсорную панель, которая поставляется с Windows 10, которая должна быть приложением универсальной платформы Windows.

После некоторого взлома реестра я понял, что могу запустить сенсорную панель, используя запустить поведение с зарегистрированными протоколами, например:

"%SystemRoot%\system32\LaunchWinApp.exe" "ms-virtualtouchpad:"

Я нашел эту информацию по этому ключу:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ms-virtualtouchpad]
@="URL:Virtual Touchpad"
"EditFlags"=dword:00200000
"URL Protocol"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ms-virtualtouchpad\Shell]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ms-virtualtouchpad\Shell\Open]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ms-virtualtouchpad\Shell\Open\Command]
@=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%\system32\LaunchWinApp.exe" "%1"

Этот DelegateExecute связан с этим ключом:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{54058896-4775-4C34-8B62-789FB2E263A4}]
@="VirtualTouchpadFlow Class"

[HKEY_CLASSES_ROOT\CLSID\{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%\system32\twinui.pcshell.dll

Поэтому для моего приложения или сценария, отличного от UWP, я отключил его. Затем проблема заключается в том, чтобы отключить его. Итак, если это приложение UWP, я предполагаю, что мне нужно перевести его либо в состояние Suspend, либо каким-то образом отправить его на прекращение.

Я не вижу много документации для LaunchWinApp, и я не заметил ничего похожего на Close/Suspend/Terminate.

Я могу запустить виртуальную сенсорную панель другим способом, но, насколько я могу судить, в настоящее время нет вопросов и ответов даже по программному запуску.

Как мне поступить?


person kayleeFrye_onDeck    schedule 17.10.2017    source источник
comment
Вы должны просто иметь возможность ShellExecuteEx пользовательский URI, а затем завершите процесс позже. Не то чтобы это обязательно хорошая идея...   -  person Peter Torr - MSFT    schedule 18.10.2017
comment
Как это возможно, @PeterTorr-MSFT? Возможно, я неправильно понял вашу цель обучения. LaunchWinApp.exe — это процесс, используемый для запуска приложения UWP, но LaunchWinApp не сохраняется, а несколько замаскированные сгенерированные процессы (например, суррогаты COM) не отключают виртуальную сенсорную панель Windows после их уничтожения.   -  person kayleeFrye_onDeck    schedule 18.10.2017
comment
Вы должны быть в состоянии выполнить любой зарегистрированный обработчик схемы. На своем компьютере я попробовал Start -> Run -> ms-virtualtrackpad:, и ничего не произошло, но у меня нет сенсорного экрана на этом ПК. Я не вижу этого в документации, поэтому, вероятно, он все равно не будет поддерживаться. Рассмотрите возможность отправки отзыва на wpdev.uservoice.com.   -  person Peter Torr - MSFT    schedule 04.11.2017
comment
@PeterTorr-MSFT В конце концов я нашел окно и имя класса через Spy++ и закрыл его с помощью SendMessage с API-интерфейсами Win32.   -  person kayleeFrye_onDeck    schedule 04.11.2017


Ответы (2)


Вот пример рабочего кода 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;
}
person kayleeFrye_onDeck    schedule 04.11.2017
comment
Я не могу запустить (включить) виртуальную сенсорную панель с помощью этого кода, но ее скрытие/закрытие работает. - person Jeff T.; 08.05.2018
comment
ShellExecute(0, 0, "ms-virtualtouchpad:", 0, 0, SW_HIDE); у меня не работает. - person Jeff T.; 08.05.2018
comment
@ДжеффТ. не могли бы вы сказать мне, какую версию Windows вы используете? Я думал, что это перестало работать, когда RedStone 3 вышел в свет, но я только что пересобрал и успешно запустил его на RS3, версия 1709 (сборка ОС 16299.371); вы можете быстро получить эту информацию, запустив winver - person kayleeFrye_onDeck; 09.05.2018
comment
Привет @kayleeFrye_onDeck, я запускаю его на ОС Build 16299.371, но он все еще не работает. Я также пробовал WinExec() и system(). Оба не работали, даже я запустил скрипт bat, который включает start ms-virtualtouchpad:. - person Jeff T.; 09.05.2018
comment
Но если я вручную нажму, чтобы запустить bat-скрипт, который включает start ms-virtualtouchpad:, его можно будет запустить. Не знаю, как Windows 10 не позволяет пользователям запускать ее программно. - person Jeff T.; 09.05.2018
comment
В вашем ноутбуке есть настоящий тачпад? Если ваше устройство представляет собой полноэкранный планшет (например, ipad) без настоящей сенсорной панели, я думаю, результат может быть другим. Поскольку мое устройство представляет собой просто планшет, имя Touchpad не отображается в Settings/Devices, если только я не запустил виртуальный тачпад вручную. - person Jeff T.; 09.05.2018
comment
@ДжеффТ. это проприетарная часть HW, которую использует моя компания; это не совсем традиционная тачпад, это больше похоже на сенсорный экран, подключенный к ПК. Я знаю, что мой домашний компьютер не может этого сделать, так как он даже не может запустить сенсорную панель, поскольку нет устройств, поддерживающих сенсорное управление. Я не знал о проблемах, связанных с конкретным устройством, с этим использованием, но это полезно знать! Просто любопытно, вы пробовали написанный образец? Мне было бы интересно узнать, где в коде он перестает работать, как ожидалось. - person kayleeFrye_onDeck; 09.05.2018

@KayleeFrye_onDeck, извините за поздний ответ.

Наконец-то я могу запустить ms-virtualtouchpad. Причина в том, что мое устройство работало на ОС x64, моя программа x86 должна обращаться к LaunchWinApp.exe под C:\Windows\Sysnative вместо C:\Windows\System32 как здесь сказано. Так что работает! Спасибо за ваше исследование заранее!

person Jeff T.    schedule 24.05.2018