任何人都可以帮助我吗?我想创建一个应用程序,例如用户访问控制 (UAC) 应用程序。当 UAC 运行时,我们无法单击屏幕上的任何位置,除非我们关闭 UAC 窗口。我们也不能按任何键来做任何事情,比如窗口键或任何功能键。因此,我想使用 C++ 代码创建一个类似的应用程序来控制键盘和鼠标,在我的应用程序窗口中仅启用鼠标和键盘并在外部禁用,除非我不关闭我的应用程序,否则我无法执行任何其他任务。我的应用程序将只是一个带有关闭按钮的图形简单窗口,以及上面提到的控件。
问问题
988 次
1 回答
1
很久以前,Windows 支持系统模式对话框。这些将阻止用户与包括桌面在内的其他窗口进行交互。由于它引起的问题,微软很久以前就取消了对此的支持。
现在,当 Windows 需要为 UAC 提供系统模式窗口时,他们会使用一些桌面魔法。为了模拟一个系统模式窗口,UAC 会做这样的事情。
- 创建位图并拍摄当前桌面的快照。
- 使位图变暗
- 创建一个新桌面
- 将新桌面设置为当前活动的桌面。
- 创建一个新桌面大小的窗口并在其中绘制位图。
现在他们有一个看起来像旧的桌面,就像一个系统模型窗口一样。然后,您可以自由地创建一个子窗口来获取用户的输入。下面的示例显示了如何创建桌面并切换到它,应该是您想要做的一个很好的起点
// TODO: Make a copy of the current desktop
// Prepeare a new desktop and activate it
HDESK oldDesktop = GetThreadDesktop(GetCurrentThreadId());
HDESK desktop = CreateDesktop(L"MyDesktop", NULL, NULL, 0, GENERIC_ALL, NULL);
SwitchDesktop(desktop);
// TODO: Create the window that draws the snapshot of the old desktop
// TODO: Create a dialog with buttons and stuff
// Since we don't have a window sit for 5 seconds staring at blank screen
Sleep(5000);
// Switch back to the old desktop and destroy the one we created
// ALERT: If we crash or exit without doing this you will need to
// restart windows
SwitchDesktop(oldDesktop);
CloseDesktop(desktop);
您可以在桌面相关 API上找到更多信息
于 2013-04-24T00:49:10.593 回答