C++ 在Windows 8中从开始菜单切换到桌面

C++ 在Windows 8中从开始菜单切换到桌面,c++,windows-8,desktop,startmenu,C++,Windows 8,Desktop,Startmenu,有没有一种方法可以通过编程从“开始”菜单切换到桌面。例如,如果您有一个在用户登录后运行的服务,并且您希望该服务在用户登录后切换到桌面视图?我似乎找不到解决的办法。我试着用虚拟键按windows键,但没用?我不确定你到底面临什么问题。“以编程方式从开始菜单切换到桌面”可以用几种不同的方式来解释 但是,由于您说“您希望该服务切换到桌面”“我尝试了虚拟按键的windows键”,我假设您正在尝试通过服务与桌面上的windows进行通信,这是无法完成的。这是一种安全特性。如果打开任务管理器并执行查看->选

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

我不确定你到底面临什么问题。“以编程方式从开始菜单切换到桌面”可以用几种不同的方式来解释

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

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

执行此操作需要使用的API调用有:

CreateProcessAsUser

WTSGetActiveConsoleSessionId

WTSQueryUserToken

DuplicateTokenEx

编辑

如果要控制“开始”菜单,也没有简单的方法。如果必须这样做,我建议您使用名为Spy++的工具(随visual studio提供-请参阅Microsoft visual studio x.x\Common7\Tools,也可以是)。使用“查找窗口”功能可以在按下Windows开始按钮时查看发送到该按钮的消息,然后可以查看要发送到该按钮的消息,以便按需要的方式控制该按钮


例如,您可能会看到发送到开始按钮的
WM_LBUTTONDOWN
消息。这将切换“开始”菜单。然后,您可以使用
FindWindow
,或者使用
GetDesktopWindow
来获取开始按钮的句柄,然后使用
SendMessage
发送要控制它的消息。您可能还想通过使用相同的过程来获取开始菜单的句柄,并使用
IsWindowVisible

来检查是否显示开始菜单。我不确定您所面临的问题到底是什么。“以编程方式从开始菜单切换到桌面”可以用几种不同的方式来解释

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

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

执行此操作需要使用的API调用有:

CreateProcessAsUser

WTSGetActiveConsoleSessionId

WTSQueryUserToken

DuplicateTokenEx

编辑

如果要控制“开始”菜单,也没有简单的方法。如果必须这样做,我建议您使用名为Spy++的工具(随visual studio提供-请参阅Microsoft visual studio x.x\Common7\Tools,也可以是)。使用“查找窗口”功能可以在按下Windows开始按钮时查看发送到该按钮的消息,然后可以查看要发送到该按钮的消息,以便按需要的方式控制该按钮


例如,您可能会看到发送到开始按钮的
WM_LBUTTONDOWN
消息。这将切换“开始”菜单。然后,您可以使用
FindWindow
,或者使用
GetDesktopWindow
来获取开始按钮的句柄,然后使用
SendMessage
发送要控制它的消息。您可能还希望通过使用相同的过程来获取开始菜单的句柄,并使用
IsWindowVisible

“…希望该服务在用户登录后切换到桌面视图来检查开始菜单是否显示”你是在问,当用户登录时,服务应用程序如何最小化所有窗口?我就是以这个为例的。但是,如果显示“开始”菜单并触发一些事件,比如说用户单击某个对象时调用函数switch2desktop(),我想知道是否有代码可以放在switch2desktop()函数中以切换到桌面。我找不到任何回复您上述评论的答案中的编辑。重申“是否有一种程序化的方式来关闭Metro?”…希望该服务在用户登录后切换到桌面视图“您是否在询问当用户登录时,服务应用程序如何最小化所有窗口?我以此为例。但是,如果显示“开始”菜单并触发一些事件,比如说用户单击某个对象时调用函数switch2desktop(),我想知道是否有代码可以放在switch2desktop()函数中以切换到桌面。我找不到任何回复您上述评论的答案中的编辑。重申“是否有一种程序化的方式关闭Metro?”我不知道为什么虚拟按键不起作用。有没有办法在com中发送虚拟按键