有没有办法以编程方式从开始菜单切换到桌面。例如,如果您有一个用户登录后运行的服务,并且您希望该服务在用户登录后切换到桌面视图?我似乎无法找到解决办法。我尝试了按下Windows键的虚拟按键但是没有用?
答案 0 :(得分:1)
我真的不确定你面临的问题是什么。 “以编程方式从开始菜单切换到桌面”可以通过几种不同的方式进行解释。
但是,既然你说“你想要那个服务切换到桌面”“我试过按下windows键的虚拟按键”,我假设你试图通过服务与桌面上的windows进行通信,这不是完成。这是设计为安全功能。如果您打开任务管理器并执行查看 - >选择列 - >会话ID,您会注意到该服务在会话0中运行,而“桌面”应用程序在登录用户的会话中运行。应用程序无法在会话之间通过Windows消息进行通信。
虽然只需发送虚拟按键,但需要付出更多努力。解决方法是让您的服务在用户会话中创建一个流程,然后为您执行任务(例如,您的虚拟按键方法可以在此应用程序中使用)。
您需要使用的API调用是:
CreateProcessAsUser
WTSGetActiveConsoleSessionId
WTSQueryUserToken
DuplicateTokenEx
修改强>
如果你想控制开始菜单,也没有简单的方法。如果你必须这样做,我建议你使用一个名为Spy ++的工具(随Visual Studio一起提供 - 参见Microsoft Visual Studio x.x \ Common7 \ Tools,或者可以是downloaded)。使用“查找窗口”功能查看按下时发送到Windows“开始”按钮的消息,然后您可以查看要发送到按钮的消息,以便按照您需要的方式对其进行控制。
例如,您可能会看到发送到开始按钮的WM_LBUTTONDOWN
消息。切换开始菜单。然后,您可以使用FindWindow
,也许使用GetDesktopWindow
来获取开始按钮的句柄,然后使用SendMessage
发送您想要控制它的消息。您可能还想检查是否使用相同的步骤显示开始菜单以获取开始菜单的句柄并使用IsWindowVisible
。