Click here to Skip to main content
Click here to Skip to main content
Go to top

Disable keyboard and show images for the children

, 20 Feb 2005
Rate this:
Please Sign up or sign in to vote.
An application to let run every time a child is over your computer.

The application showing a cool image.

Introduction

I wrote this article, not only as a computer engineer I am, but also as a father I became of two marvelous children I have. I have always turned on the computer and my children try to use it by clicking the mouse, and striking, smashing and smiting the keyboard. Often, they push the 'Windows' key or the 'Esc' key, or some other key that finishes the execution of some programs, starts applications, etc… That is the reason why I developed this little tool that allows my 'marvelous beasts' to hit the keys they want and the only thing that occurs is that an image will be changed.

What this application does is, cancels all the keyboard events except:

  • Ctrl+Alt+Del Captured by OS and
  • Ctrl+Alt+End used for finishing the application.

All the other events will be captured and ignored. On the other hand, it will show an image randomly taken from the images stored in the directory Images, and this image will change every certain number of seconds defined in the application. Also, it will change the mouse cursor with an icon randomly taken from the directory Images every certain number of seconds or every 100 mouse move events.

Before executing the demo

Before executing the demo, we must get some BMPs and ICOs and put them into the Images directory.

Using the code

The application is very simple, and here I only present a minimal version just for maintaining the code clean and easy to read. There are three classes:

  • CForTheKidsApp: the application class, created by the environment.
  • CForTheKidsDlg: the dialog class that will be shown and having the control-view.
  • CImageLoader: an auxiliary class that will help us find what images to load and load it into a static control, cursor, etc…

The main function that is called is in the initialization of the dialog (CForTheKidsDlg::OnInitDialog()) and it will do the Hook to the keyboard. This hook procedure will monitor low-level keyboard input events. As the procedure that will be called is a global procedure, and we will need the hook itself, we declare a global variable called TheKeyHook that will have the HHOOK handle. For doing that, we execute the following statement:

TheKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, ppI,0);

We want that the LowLevelKeyboardProc will filter all the keyboard events except one combination that will let us finish the application. We decide that this combination could be Ctrl+Alt+End because it is a combination that a child rarely can execute because of the separation that exists between those keys. This procedure must return 1 if we want that the event be ignored.

That is the reason that if the code is a HC_ACTION then we always return 1, except for the Ctrl+Alt+End combination in which case we exit the application. For more information about this, see LowLevelKeyboardProc in MSDN.

It is important to remark that before we exit the application, we must unhook the keyboard event and send a message to the main window to close, using the following sentences:

UnhookWindowsHookEx(TheKeyHook);
SendMessage(TheMainWndHnd,WM_CLOSE,0,0);

The LowLevelKeyboardProc procedure will be the following:

LRESULT CALLBACK LowLevelKeyboardProc(INT nCode, WPARAM wParam, LPARAM lParam)
{
    try
    {
        // By returning a non-zero value from the hook procedure, the
        // message does not get passed to the target window
        KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
        int error=GetLastError();   
        switch (nCode)
        {
            case HC_ACTION:
            {
                // Disable all keys except CTRL + ALT + END. 
                // This combination will finish the aplication
                BOOL bControlKeyDown = 
                  GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);
                if (pkbhs->vkCode == VK_END && 
                    LLKHF_ALTDOWN && bControlKeyDown)
                {
                    UnhookWindowsHookEx(TheKeyHook);
                    SendMessage(TheMainWndHnd,WM_CLOSE,0,0);
                }
                else
                    return 1;
                break;
            } 

            default:
                break;
        }
        CallNextHookEx (TheKeyHook, nCode, wParam, lParam);
    }
    catch(...)
    {
    }
    return 0;
}

Another important thing that it is not explained directly in most sites is that if you want to use the WH_KEYBOARD_LL flag, you must have the _WIN32_WINNT equal or greater than 1024 (0x0400). For doing that, we must include into the settings the following Preprocessor definition:

_WIN32_WINNT=1024

Special points to consider

  • The images are changed using a timer, initially set with the defines _TIMER_ELAPSE_BMP_ and _TIMER_ELAPSE_ICO_.
  • The timers have the identifiers defined with _TIMER_CHANGEBMP_ and _TIMER_CHANGEICO_.
  • The images are taken from the directory Images placed where the application is executed.

Ideas for improving the application

  • The code, as is, is just the beginning of what this program can do. I only change the image every N milliseconds, but we can add an OnLButtonDown event, an OnRButtonDown event, and we can use the hook for intercepting some keys that we would want to have some special behavior.
  • It only reads .bmp and .ico files because it is not the aim of this tool to read all kinds of images, and adding this functionality will only complicate the reading of the code. If you want, you can easily add other kinds of images into the CImageLoader class.
  • The image directory, elapsed time, etc… are hard-coded, but it can be easily extracted and put into an .ini file.
  • If we want, we can use this tool to teach numbers and letters to our children. For instance, we show an image of the letter P and we want that the child press that key. If he or she does that, we can show a beautiful image or play a nice music. They can investigate all the keys, and those keys we do not want them to touch, we can easily 'cancel' from the system.
  • In my computer, I download lots of images of bulldozers and trains, and every time my child smashes the keyboard, another train/bulldozer appears and he has fun!

Remarks for debugging

  • If we debug the application, we must not use the hook, because the keyboard will be ignored, and if a breakpoint is set, the application will stop and the keyboard 'hangs'. In this case, we must finish the IDE, losing all the data not saved and, often, we must restart the computer.
  • The main dialog CForTheKidsDlg, has the System modal property enabled, which prohibits switching to another window or program while the dialog box is active. Take care while debugging to set it to false allowing the debugger to be switched.

History

Minimal version.

Version 1.0 with memory leak solved, thanks to VaKa.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

pocjoc
Architect
Spain Spain
Software engineer specialist in OO analisys and design.

Comments and Discussions

 
GeneralMy vote of 5 Pinmembermk1488217-Sep-10 0:14 
QuestionDisable Keyboard Question... Pinmembergn0058895012-Mar-10 16:59 
AnswerRe: Disable Keyboard Question... Pinmemberpocjoc15-Mar-10 2:09 
GeneralRe: Disable Keyboard Question... Pinmembergn0058895015-Mar-10 17:55 
GeneralRe: Disable Keyboard Question... Pinmemberpocjoc18-Mar-10 5:25 
Generaljust what i need! Pinmembermaretzel6-Aug-08 19:04 
Generalkeyboard input to two process Pinmemberhgm6887-Jun-08 10:16 
GeneralRe: keyboard input to two process Pinmemberpocjoc10-Jul-08 2:55 
Questiondetect external keyboard? Pinmemberahmetsacan23-Feb-08 7:54 
AnswerRe: detect external keyboard? Pinmemberpocjoc24-Feb-08 21:10 
Questionundeclared identifier error..... Pinmemberponnalagan22-Jun-07 0:45 
AnswerRe: undeclared identifier error..... Pinmemberpocjoc22-Jun-07 1:01 
AnswerRe: undeclared identifier error..... Pinmemberk_selvanathan22-Jun-07 1:14 
GeneralRe: undeclared identifier error..... Pinmemberponnalagan22-Jun-07 1:23 
Generalprojects Pinmembervaibhva21-Jun-07 18:59 
Generalf Pinmembervaibhva21-Jun-07 18:50 
QuestionPerfect!!! PinmemberJTrujillo_ISI14-Mar-07 6:35 
AnswerRe: Perfect!!! Pinmemberpocjoc14-Mar-07 21:36 
GeneralWindow movement restriction PinmemberAKG20-Feb-07 22:06 
GeneralRe: Window movement restriction Pinmemberpocjoc22-Feb-07 23:45 
QuestionHow GetWindowThreadProcessId() works? PinmemberEsonix13-Feb-07 23:12 
AnswerRe: How GetWindowThreadProcessId() works? Pinmemberpocjoc14-Feb-07 0:05 
QuestionHi - Help! [modified] Pinmembermv_xm8-Nov-06 7:58 
AnswerRe: Hi - Help! Pinmemberpocjoc9-Nov-06 0:31 
GeneralRe: Hi - Help! Pinmembermv_xm9-Nov-06 3:19 
QuestionRe: Hi - Help! Pinmembermv_xm9-Nov-06 3:53 
AnswerRe: Hi - Help! Pinmemberpocjoc10-Nov-06 0:30 
QuestionRe: Hi - Help! Pinmembermv_xm10-Nov-06 1:41 
AnswerRe: Hi - Help! Pinmemberpocjoc10-Nov-06 1:53 
JokeRe: Hi - Help! Pinmembermv_xm10-Nov-06 4:53 
Generalsimpler Pinmemberjqt12-Sep-06 13:25 
AnswerRe: simpler Pinmemberpocjoc12-Sep-06 20:59 
QuestionHow to disable CTRL+ALT+DEL ? PinmemberCold-Fire11-Aug-06 3:27 
AnswerRe: How to disable CTRL+ALT+DEL ? Pinmemberpocjoc9-Nov-06 0:39 
GeneralRe: How to disable CTRL+ALT+DEL ? PinmemberJerry Jeremiah14-Oct-07 18:39 
QuestionHow to make it work under windows 98 and lower? Pinmemberly2157672124-Apr-06 23:38 
AnswerRe: How to make it work under windows 98 and lower? Pinmemberpocjoc25-Apr-06 20:53 
GeneralRe: How to make it work under windows 98 and lower? Pinmemberly2157672126-Apr-06 3:06 
GeneralWH_KEYBOARD_LL Pinmembereaster_20077-Feb-06 11:11 
GeneralRe: WH_KEYBOARD_LL Pinmemberpocjoc7-Feb-06 23:39 
JokeRe: WH_KEYBOARD_LL Pinmembereaster_200720-Feb-06 21:57 
QuestionRe: WH_KEYBOARD_LL Pinmemberpocjoc20-Feb-06 22:07 
GeneralUndeclared identifier KBDLLHOOKSTRUCT Pinmembermohsen nourian26-Dec-05 4:09 
GeneralRe: Undeclared identifier KBDLLHOOKSTRUCT PinmemberaTxIvG400220-Dec-06 3:03 
GeneralRe: Undeclared identifier KBDLLHOOKSTRUCT Pinmembergonadthebarbarian8-Jan-07 6:24 
GeneralRe: Undeclared identifier KBDLLHOOKSTRUCT Pinmemberjst2tzu5-Mar-07 12:15 
QuestionHow to stop other messages from happening? Pinmemberluyongxing1-Dec-05 13:27 
AnswerRe: How to stop other messages from happening? Pinmembergonadthebarbarian8-Jan-07 7:04 
GeneralMemory Leak PinmemberVaKa15-Feb-05 20:12 
GeneralRe: Memory Leak Pinmemberpocjoc16-Feb-05 0:52 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140916.1 | Last Updated 21 Feb 2005
Article Copyright 2005 by pocjoc
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid