对于我的应用程序,需要在应用程序运行时阻止任何用户输入。我正在使用User32.dll的“BlockInput”函数来实现这一目标。
问题是如果用户没有管理员权限,则该功能不起作用。我现在已经实现了一项服务(使用本地系统权限运行)来完成这项工作,即使用户没有管理员权限。
不幸的是,函数调用现在只锁定服务会话的输入设备,而不是用户会话的输入设备。
如何为当前用户会话调用User32.dll函数(来自服务)?
答案 0 :(得分:2)
如何为当前用户会话调用User32.dll函数(来自服务)?
您的服务需要使用CreateProcessAsUser()
在用户会话的上下文中启动新流程,然后该流程可以调用BlockInput()
。
该服务可以使用WTSQueryUserToken()
获取CreateProcessAsUser()
所需的用户令牌。
要获取用户令牌,服务需要知道用户正在运行的会话ID。您的Java应用程序可以使用OpenProcessToken()
和GetTokenInformation()
发现自己的会话ID,然后发送通过IPC机制向服务提供ID。或者,该服务可以使用WTSEnumerateSessions()
和WTSQuerySessionInformation()
来搜索会话。
答案 1 :(得分:0)
如何为当前用户的会话调用user32.dll函数(来自服务)?
你做不到。对BlockInput
的限制是有原因的,系统没有提供绕过它们的方法。如果确实如此,首先是限制的重点是什么。
这很简单。如果您想致电BlockInput
,那么您需要足够的权利。