8

在我的 C# 控制台应用程序中,我使用SendMessage()最小化所有窗口,有效地显示 Windows 8 旧版桌面。这很好用,但Thread.Sleep(1000)在我尝试做其他事情之前,我必须使用 a 来等待 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;
4

1 回答 1

2

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

(1) 在您的项目中添加对“Shell32”的引用(通过添加引用 -> COM -> Microsoft Shell Controls and Automation)。

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

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

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

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

于 2013-05-27T11:09:32.737 回答