1

有没有办法以编程方式从开始菜单切换到桌面。例如,如果您有一个在用户登录后运行的服务,并且您希望该服务在用户登录后切换到桌面视图?我似乎找不到解决方法。我试过按windows键的虚拟按键,但没用?

4

1 回答 1

1

我不确定您所面临的问题究竟是什么。“以编程方式从开始菜单切换到桌面”可以解释为几种不同的方式。

但是,由于您说“您希望该服务切换到桌面”“我尝试按下 windows 键的虚拟按键”,我假设您正在尝试通过服务与桌面上的 windows 进行通信,这是无法完成的。这是设计为一种安全功能。如果您打开任务管理器并查看 -> 选择列 -> 会话 ID,您会注意到服务在会话 0 中运行,而“桌面”应用程序在登录用户的会话中运行。应用程序无法在会话之间通过 Windows 消息进行通信。

有一种解决方法,尽管比简单地发送虚拟按键需要更多的努力。解决方法是让您的服务在用户会话中创建一个进程,然后为您执行任务(例如,您的虚拟按键方法将在此应用程序中工作)。

您需要用来执行此操作的 API 调用是:

CreateProcessAsUser

WTSGetActiveConsoleSessionId

WTSQueryUserToken

DuplicateTokenEx

编辑

如果你想控制开始菜单,也没有简单的方法。如果一定要这么做,我建议你使用一个叫做 Spy++ 的工具(Visual Studio 自带——见 Microsoft Visual Studio xx\Common7\Tools,或者可以下载)。使用“查找窗口”功能查看按下 Windows 开始按钮时发送到的消息,然后您可以查看要发送到按钮的消息以按您需要的方式控制它。

例如,您可能会看到一条WM_LBUTTONDOWN消息发送到开始按钮。切换开始菜单。然后,您可以使用FindWindow,也许 withGetDesktopWindow来获取开始按钮的句柄,然后发送您想要控制它的消息SendMessage。您可能还想检查是否显示了开始菜单,方法是使用相同的过程来获取开始菜单的句柄并使用IsWindowVisible.

于 2012-12-06T10:28:48.150 回答