fix: 修复启用“以管理者身份运行该程序”兼容性选项时 TouchHelper 无法获得 UIAccess 权限的问题 (#1010)

This commit is contained in:
Xu 2024-10-19 16:12:50 +08:00 committed by Xu
commit bb640f6a53
3 changed files with 17 additions and 6 deletions

View file

@ -106,7 +106,9 @@ bool TouchHelper::TryLaunchTouchHelper(bool& isTouchSupportEnabled) noexcept {
return false;
}
if (!Win32Utils::ShellOpen(path.c_str(), nullptr, false)) {
// GH#992: 必须委托 explorer 启动 ToucherHelper否则如果启用了“以管理者身份运行该程序”
// 兼容性选项ToucherHelper 将无法获得 UIAccess 权限
if (!Win32Utils::ShellOpen(path.c_str(), nullptr, true)) {
Logger::Get().Error("启动 TouchHelper.exe 失败");
return false;
}

View file

@ -358,6 +358,15 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n
}
switch (msg) {
case WM_CREATE:
{
// TouchHelper 的权限可能比我们低
if (!ChangeWindowMessageFilterEx(Handle(), WM_MAGPIE_TOUCHHELPER, MSGFLT_ADD, nullptr)) {
Logger::Get().Win32Error("ChangeWindowMessageFilter 失败");
}
break;
}
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
{

View file

@ -19,6 +19,11 @@ static UINT WM_MAGPIE_QUIT;
static void InitMessages() noexcept {
WM_MAGPIE_SHOWME = RegisterWindowMessage(CommonSharedConstants::WM_MAGPIE_SHOWME);
WM_MAGPIE_QUIT = RegisterWindowMessage(CommonSharedConstants::WM_MAGPIE_QUIT);
// 允许被权限更低的实例唤醒
if (!ChangeWindowMessageFilter(WM_MAGPIE_SHOWME, MSGFLT_ADD)) {
Logger::Get().Win32Error("ChangeWindowMessageFilter 失败");
}
}
// 我们需要尽可能高的时钟分辨率来提高渲染帧率。
@ -203,11 +208,6 @@ bool XamlApp::_CheckSingleInstance() noexcept {
PostMessage(HWND_BROADCAST, WM_MAGPIE_SHOWME, 0, 0);
return false;
}
// 以管理员身份运行时允许接收 WM_MAGPIE_SHOWME 消息,否则无法被该消息唤醒
if (!ChangeWindowMessageFilter(WM_MAGPIE_SHOWME, MSGFLT_ADD)) {
Logger::Get().Win32Error("ChangeWindowMessageFilter 失败");
}
}
bool alreadyExists = false;