Aiman Sk
Aiman Sk

Reputation: 29

How to Control Keyboard and Mouse like UAC window

Can anyone kindly help me out? I want to create an app, like user access control(UAC) application. When UAC is running we cannot click anywhere on the screen, unless we close UAC window. Also we cannot press any key to do anything, like window key or any of the function key. So I want to create a similar application using C ++ code to control keyboard and mouse, that only mouse and keyboard is enabled in my application window and disable outside and unless i do not close my app i cant perform any other task. My application would be just a graphical simple window with a close button, and obove mentioned controls.

Upvotes: 2

Views: 1097

Answers (1)

Captain Obvlious
Captain Obvlious

Reputation: 20073

A long time ago Windows supported system modal dialogs. These would prevent the user from interacting with other windows including the desktop. Microsoft removed support for this a long time ago due to the problems that it caused.

Now when Windows needs to provide a system modal window for UAC they use a bit of desktop magic. To simulate a system modal window UAC does something like this.

  • Create a bitmap and take a snapshot of the current desktop.
  • Darken the bitmap
  • Create a new desktop
  • Set the new desktop as the currently active one.
  • Create a window the size of the new desktop and draw the bitmap in it.

Now they have a desktop that looks like the old and acts as if it were a system model window. You are then free to create a child window to grab input from the user. The example below shows how to create a desktop and switch to it and should be a good starting point for what you want to do

// 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);

You can find more information on the desktop related API's

Upvotes: 1

Related Questions