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

本文关键字:等待 方法 有效 桌面 显示 最小化 SendMessage 窗口 Thread 使用 Sleep | 更新日期: 2023-09-27 18:15:36

在我的c#控制台应用程序中,我使用SendMessage()最小化所有窗口,有效地显示windows 8 Legacy Desktop。这工作得很好,但是我必须使用Thread.Sleep(1000),以便在我尝试做任何其他事情之前等待Legacy Desktop实际显示。

IntPtr lHwnd = FindWindow("Shell_TrayWnd", null);
SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL, IntPtr.Zero);
Thread.Sleep(1000);

我真的想用一种更有效的方法来替换Thread.Sleep(),以便在继续之前检测Legacy Desktop是否显示。

任何想法?

编辑:以下是互操作包装器和常量。万一有帮助的话……

[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;

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

我不确定这是否会对你更好,但也许值得一试…

(1)添加到您的项目引用"Shell32"(通过添加引用-> COM ->微软Shell控制和自动化)。

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

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

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

然而,我怀疑这只是做SendMessage()的另一种方式。