使用拖放功能进行UIAccess

时间:2018-01-20 08:42:45

标签: c++ wpf winapi

启用UIAccess时,有几个关于拖放无效的问题。有些提供了使用ChangeWindowMessageFilterChangeWindowMessageFilterExWM_DROPFILES的部分解决方案。但是,这不适用于wpf个应用程序。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

通常情况下启用了UIAccess启用的应用High Integrity - 这就是阻止拖放工作的原因。

我尝试将应用程序本身内的完整性级别更改为中级,但这没有任何影响。

对于寻求解决方案的其他人来说,这就是我想出来的。在其他UIAccess启用的流程中,您可以使用CreateProcessAsUser启动流程....以下是代码

HANDLE hToken;
HANDLE hTokenDup;
DWORD dwUIAccess = 1;

OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE, &hToken);
DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hTokenDup);

// enable UIAccess
SetTokenInformation(hTokenDup, TokenUIAccess, &dwUIAccess, sizeof(dwUIAccess));

// medium integrity sig
ConvertStringSidToSid(L"S-1-16-8192", &pSid);

TOKEN_MANDATORY_LABEL tml = { 0 };

tml.Label.Attributes = SE_GROUP_INTEGRITY;
tml.Label.Sid = pSid;

// set medium integrity
SetTokenInformation(hTokenDup, TokenIntegrityLevel, &tml, sizeof(tml) + GetLengthSid(pSid));

FreeSid(pSid);

CreateProcessAsUser(hTokenDup, pathToExe, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)

希望这会有所帮助......