我编写了一个具有覆盖类型窗口的应用程序,可以通过热键显示和隐藏,而另一个应用程序具有焦点.所述其他应用程序是使用管理员权限运行的DirectX游戏.
我已经尝试了3种可能的解决方案,当我在其他应用程序中按下热键时收到通知,其中2种工作,但要求我的应用程序也具有管理权限.这是可以接受的,但我宁愿有一个不需要这些特权的解决方案.我确信必须有一种方法,因为像TeamSpeak这样的应用程序确实能够在不以管理员身份运行的情况下接收输入.
我已经尝试过了:
所以,是的,如果有人可以为不同的解决方案提供一个想法,我会非常感激,因为我无法想到......我正在使用Delphi,但是因为我依赖Windows API,所以我不这样做认为解决方案将特定于语言.
我尝试在Win7上模拟鼠标事件,我的应用程序使用网站http://inputsimulator.codeplex.com/上的开源项目"Windows输入模拟器",它在内部使用以下代码来模拟鼠标事件:
[DllImport("user32.dll", SetLastError = true)]
public static extern UInt32 SendInput(UInt32 numberOfInputs, INPUT[] inputs, Int32 sizeOfInputStructure);
Run Code Online (Sandbox Code Playgroud)
当我使用Visual Studio 2010进行调试时,我的应用程序运行完美.左键单击事件,右键单击事件和鼠标移动事件都可以.但是,当我通过双击.exe应用程序可删除文件从资源管理器启动我的应用程序时,不会发送单击事件.只有鼠标移动事件没问题,如果我尝试模拟左键单击或右键单击,我的应用程序将收到异常并退出.我发现异常是由以下代码抛出:
public void DispatchInput(INPUT[] inputs)
{
if (inputs == null) throw new ArgumentNullException("inputs");
if (inputs.Length == 0) throw new ArgumentException("The input array was empty", "inputs");
var successful = NativeMethods.SendInput((UInt32)inputs.Length, inputs, Marshal.SizeOf(typeof (INPUT)));
if (successful != inputs.Length)
throw new Exception("Some simulated input commands were not sent successfully. The most common reason for this happening are the security features of Windows including User …Run Code Online (Sandbox Code Playgroud) 背景:
我需要在另一台显示器上创建调光效果.我想我通过使用WPF窗口解决了这个问题,该窗口占用了整个屏幕尺寸Topmost和AllowsTransparency=.它具有内部黑色发光效果,并且具有WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW应用于其中的样式(以及其他内容),以允许用户点击其后面的应用程序.
我监视EVENT_OBJECT_REORDERWindows 中的事件并调用SetWindowPos强制Topmost状态高于其他Topmost窗口.到目前为止,我的概念测试证明似乎运作良好.
我发现的问题是这个调光(窗口)会覆盖任务栏,但是如果我单击开始菜单则不会.我目前正在使用Windows 10进行测试.如果单击"开始"菜单,则会导致"开始"菜单和任务栏显示在调光(窗口)上方.我希望一切都保持黯淡.
我通过uiAccess在应用程序清单中设置= true 来解决此问题,生成自签名证书,并将exe复制到"c:\ program files*".这允许我强制窗口的最顶级状态,甚至在开始菜单上方.
我的问题:
有没有办法在没有开始菜单的情况下定位窗口uiAccess?或者甚至是另一种在不使用窗口的情况下强制屏幕昏暗(但不依赖于显示器驱动程序或硬件功能)的方法?
如果没有,在分发WPF应用程序(通过WiX安装项目或类似的东西)时,我需要注意什么,以绕过UIPI限制uiAccess= True?我可以在安装过程中简单地安装自签名证书吗?用户是否会遇到任何其他障碍?作为一名开发人员,在构建此问题时,我是否会遇到任何其他障碍(除了我已经提到过的内容)?
谢谢!
出于安全原因,我的应用程序的 UI 模块以high 强制完整性级别运行。除了一件事之外,其中的所有内容都运行良好。为了与旧版本兼容,我需要能够让用户向 UI 模块发出命令行调用。
目前该机制的工作原理如下:
Windows 资源管理器中的快捷方式调用我的模块,如下所示:
path-to-module\module.exe -op="a, s, r"
Run Code Online (Sandbox Code Playgroud)当进程解析此命令行时,它会使用FindWindow通过其唯一的类名来module.exe定位正在运行的 UI 模块副本(或自身的另一个副本) 。然后,它使用PostMessage API 向其发送注册消息。
然后,正在运行的 UI 模块(具有high完整性级别)在收到消息时会相应地对其进行处理。
问题在于,由于UI模块的运行副本具有high完整性级别,因此它无法接收来自较低完整性级别的消息,或者当Windows资源管理器运行该模块的副本以解析快捷方式命令时,它无法接收来自较低完整性级别的消息,这使得它以medium完整性级别运行等级。
为了解决这个问题,我找到了这个UIAccess标志(请参阅此处,然后向下滚动到“ UIAccess for UI Automation applications ”。)
所以我的假设是,如果我设置此标志并对我的 UI 模块进行代码签名:
它将能够绕过我上面描述的 UIPI 限制。
它运行得很好:
但我看到的是,PostMessage当我从以完整性级别运行的模块调用它时,我上面描述的算法中的 API 仍然失败,并显示 ERROR_ACCESS_DENIED medium。
我在那里错过了什么?
我们正在编写一个仅运行的远程桌面应用程序,它使用 SendInput 进行键盘(和鼠标)交互。但是它无法与 UAC 提示交互。
我们的应用程序为此需要什么权限/权利?
背景信息:该应用程序是由复制 winlogon.exe 的访问令牌的另一个进程生成的。这使得可以在具有系统完整性级别的 SYSTEM 帐户下运行,附加到物理控制台会话,并具有与 winlogon.exe 相同的 SE 权限(https://learn.microsoft.com/en-us/windows/desktop/secauthz/特权常量),尽管并非所有这些都已启用。
struct MY_TOKEN_PRIVILEGES {
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTES Privileges[2];
};
int RunUnderWinLogon(LPCWSTR executableWithSendInput)
{
DWORD physicalConsoleSessionId = WTSGetActiveConsoleSessionId();
auto winlogonPid = GetWinLogonPid(); // external function
if (!winlogonPid)
{
std::cout << "ERROR getting winlogon pid" << std::endl;
return 0;
}
HANDLE hWinlogonToken, hProcess;
hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, winlogonPid);
if (!::OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
| TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_SESSIONID
| TOKEN_READ | TOKEN_WRITE, &hWinlogonToken))
{ …Run Code Online (Sandbox Code Playgroud)