我使用C#在Win7中创建了一个服务。在该服务中,我想使用BlockInput函数,在Win7中它似乎需要admin。
我将serviceprocessorinstaller的帐户,用户名和密码设置为代码中的管理员帐户,并且BlockInput不起作用。注意:在服务属性/登录选项卡下,它已正确设置。
然后我为我的服务添加了一个清单,并将requestedExecutionLevel设置为“requireAdministrator”。然而BlockInput仍然不想工作。
我尝试将BlockInput向下移动到客户端级别,然后移动到客户端包装器,但仍然不想工作。
没有想法......有什么建议吗?
开始编辑:
这是我的清单(或其中的一部分,抱歉格式化很糟糕)
<assemblyIdentity version="1.0.0.0" name="BlockInputService.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
namespace BlockInputService
{
[ServiceContract(Namespace = "http://BlockInputService")]
public interface IBlockInputTest
{
[OperationContract]
void BlockInputMethod();
}
public class BlockInputTest : IBlockInputTest
{
private const string SOURCE = "BlockInputService";
private const string LOGNAME = "Application";
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool BlockInput([In, MarshalAs(UnmanagedType.Bool)] bool fBlockIt);
public void BlockInputMethod()
{
if (!EventLog.SourceExists(SOURCE))
{
EventLog.CreateEventSource(SOURCE, LOGNAME);
}
try
{
bool flag = BlockInput(true);
EventLog.WriteEntry(SOURCE, "BlockInput(true) returned: " + flag);
EventLog.WriteEntry(SOURCE, "Sleep for 5 sec");
Thread.Sleep(5000);
}
catch (Exception ex)
{
EventLog.WriteEntry(SOURCE, ex.Message);
}
finally
{
bool flag = BlockInput(false);
EventLog.WriteEntry(SOURCE, "BlockInput(false) returned: " + flag);
}
}
}
}
答案 0 :(得分:0)
我继续前进并使用SetWindowsHookEx来捕获WH_KEYBOARD_LL和WH_MOUSE_LL事件。
我尝试了一切可以让BlockInput工作的东西。我仍然认为我只是将我的服务配置错误或其他什么,但我没有时间再担心它了。
感谢。