C# 使用SendMessage()最小化所有窗口,但需要比Thread.Sleep()更有效的方法来等待旧桌面显示

C# 使用SendMessage()最小化所有窗口,但需要比Thread.Sleep()更有效的方法来等待旧桌面显示,c#,C#,在我的C#控制台应用程序中,我使用SendMessage()最小化所有窗口,有效地显示了Windows8遗留桌面。这非常有效,但我必须使用线程.Sleep(1000),以便在尝试执行任何其他操作之前,等待旧桌面真正显示出来 IntPtr lHwnd = FindWindow("Shell_TrayWnd", null); SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL, IntPtr.Zero); Thread.Sleep(1000); 我真的想用

在我的C#控制台应用程序中,我使用
SendMessage()
最小化所有窗口,有效地显示了Windows8遗留桌面。这非常有效,但我必须使用
线程.Sleep(1000)
,以便在尝试执行任何其他操作之前,等待旧桌面真正显示出来

IntPtr lHwnd = FindWindow("Shell_TrayWnd", null);
SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL, IntPtr.Zero);
Thread.Sleep(1000);
我真的想用一种更有效的方法来取代
Thread.Sleep()
,在继续之前检测旧桌面是否显示

有什么想法吗

编辑: 以下是互操作包装器和常量。以防万一

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true)]
static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam);

const int WM_COMMAND = 0x111;
const int MIN_ALL = 419;
const int MIN_ALL_UNDO = 416;

我不确定这是否对你更有效,但也许值得一试

(1) 在项目中添加对“Shell32”的引用(通过添加引用->COM->Microsoft Shell控件和自动化)

(2) 将引用的“嵌入互操作类型”设置为
false

(3) 使用以下代码最小化所有窗口:

dynamic shell = new Shell32.ShellClass();
shell.MinimizeAll();

但是,我怀疑这只是执行SendMessage()的另一种方法。

您如何知道在等待桌面显示时,用户没有取消最小化其中一个窗口?你想解决的真正问题是什么?也许有一种更可靠的方法可以实现这一点。我正在尝试最小化所有窗口,然后在下一行启动一个特定的遗留桌面程序。我假设系统已经有一段时间没有被触碰过了,我只是想重新设置计算机以显示一个程序。使用SendMessage()的方式,即使计算机当前正在显示任何启动屏幕应用程序,也可以最小化对传统桌面的访问。。。但是在SendMessage()和实际启动我想要的程序之间需要一段时间。在编写这样的代码时,请始终确保卸载程序完美无缺。这将是你程序中最常用的功能。为什么你不能直接启动程序呢?为什么必须先最小化所有打开的窗口?如果windows 8开始屏幕当前是前台窗口,则无法启动旧版桌面应用程序并期望它显示出来。It/will/launch,但是It/will/show。我试过你说的,没有区别。我很感激你的建议。@user1190320我也很害怕(