2

任何人都可以帮助我吗?我想创建一个应用程序,例如用户访问控制 (UAC) 应用程序。当 UAC 运行时,我们无法单击屏幕上的任何位置,除非我们关闭 UAC 窗口。我们也不能按任何键来做任何事情,比如窗口键或任何功能键。因此,我想使用 C++ 代码创建一个类似的应用程序来控制键盘和鼠标,在我的应用程序窗口中仅启用鼠标和键盘并在外部禁用,除非我不关闭我的应用程序,否则我无法执行任何其他任务。我的应用程序将只是一个带有关闭按钮的图形简单窗口,以及上面提到的控件。

4

1 回答 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 回答