A complete pgm using the mouse & KB

// A demo of keyboard and mouse input, be sure

// to take a close look at the event handler

// hit escape to exit, or enter to put up a message box

// move the mouse around and press the buttons

// INCLUDES

#define WIN32_LEAN_AND_MEAN 

#include <windows.h> 

#include <windowsx.h>

#include <stdio.h>

#include <math.h>

// DEFINES

// defines for windows

#define WINDOW_CLASS_NAME "WINCLASS1"

// MACROS

#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)

#define KEY_UP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// GLOBALS

HWND main_window_handle = NULL; // save the window handle

// FUNCTIONS

LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg, WPARAM wparam,LPARAM lparam)

{ // this is the main message handler of the system

  PAINTSTRUCT           ps;         // used in WM_PAINT

  HDC                   hdc;  // handle to a device context

  // what is the message

  switch(msg)

  {   case WM_CREATE:

    { // do initialization stuff here

            return(0);

      } break;

      case WM_PAINT:

      {     // simply validate the window

            hdc = BeginPaint(hwnd,&ps);  

            EndPaint(hwnd,&ps);

            return(0);

      } break;

      case WM_KEYDOWN: // this message contains the virtual code

      {   // test for the escape key (exit)

          if (wparam == VK_ESCAPE)

          {  // the user is trying to kill the app, we could post

             // a quit message or send a WM_DESTROY message

             // let's do the later

             PostMessage(hwnd, WM_DESTROY,0,0);

          } // end if

          return(0);

      } break;

       

      case WM_CHAR: // this message contains the ascii code

      {   // a key has been pressed

          char buffer[80];

          sprintf(buffer,"WM_CHAR: wparam=%c, lparam=%d        ",

                  wparam,lparam);

         

          // print out the key on the screen

          hdc = GetDC(hwnd);

       

          // set the colors

          SetTextColor(hdc, RGB(0,255,0));

          SetBkColor(hdc,RGB(0,0,0));

          SetBkMode(hdc,OPAQUE);

          // output the message

          TextOut(hdc,0,0,buffer,strlen(buffer));

          // release dc

          ReleaseDC(hwnd,hdc);

          return(0);

      } break;

      case WM_MOUSEMOVE: // whenever the mouse moves this is sent

      {   // extract x,y and buttons

          int mouse_x = (int)LOWORD(lparam);

          int mouse_y = (int)HIWORD(lparam);

          int buttons = (int)wparam;

          char buffer[80];

          sprintf(buffer,"WM_MOUSEMOVE: x=%d y=%d buttons=%d        ",

                  mouse_x,mouse_y,buttons);

         

          // print out the key on the screen

          hdc = GetDC(hwnd);

       

          // set the colors

          SetTextColor(hdc, RGB(255,0,0));

          SetBkColor(hdc,RGB(0,0,0));

          SetBkMode(hdc,OPAQUE);

          // output the message

          TextOut(hdc,0,16,buffer,strlen(buffer));

          // release dc

          ReleaseDC(hwnd,hdc);   

          return(0);

      } break;

      case WM_DESTROY:

      {   // kill the application              

            PostQuitMessage(0);

            return(0);

      } break;

      default:break;

  } // end switch

  // process any messages that we didn't take care of

  return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc

// ********************  WINMAIN   ***********************

int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hprevinstance,

                              LPSTR lpcmdline,int ncmdshow)

{

  WNDCLASS winclass;    // this will hold the class we create

  HWND      hwnd;      // generic window handle

  MSG       msg;       // generic message

  // first fill in the window class stucture

  winclass.style              = CS_DBLCLKS | CS_OWNDC |

                                CS_HREDRAW | CS_VREDRAW;

  winclass.lpfnWndProc        = WindowProc;

  winclass.cbClsExtra         = 0;

  winclass.cbWndExtra         = 0;

  winclass.hInstance          = hinstance;

  winclass.hIcon              = LoadIcon(NULL, IDI_APPLICATION);

  winclass.hCursor            = LoadCursor(NULL, IDC_ARROW);

  winclass.hbrBackground      = GetStockObject(BLACK_BRUSH);

  winclass.lpszMenuName       = NULL;

  winclass.lpszClassName      = WINDOW_CLASS_NAME;

  // register the window class

  if (!RegisterClass(&winclass))

     return(0);

  // create the window

  if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME, // class

               "1ST Windows Pgm",          // title

               WS_OVERLAPPEDWINDOW | WS_VISIBLE,

               0,0,        // x,y

               320,200, // width, height

               NULL,       // handle to parent

               NULL,       // handle to menu

               hinstance,// instance

               NULL)))  // creation parms

        return(0);

  // save the window handle in a global

  main_window_handle = hwnd;

  // enter main event loop

  while(1)

  {   if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))

      {     // test if this is a quit

        if (msg.message == WM_QUIT)

           break;

     

            // translate any accelerator keys

            TranslateMessage(&msg);

            // send the message to the window proc

            DispatchMessage(&msg);

      }

   

    // main game processing goes here

    // here's a demo of the KEY_DOWN macro

    if (KEY_DOWN(VK_RETURN))   

       MessageBox(NULL, "You Pressed <ENTER> Didn't You?",

                 "Asynchronous Keyboard Test",MB_OK);

  }

  // return to Windows like this

  return(msg.wParam);

} // end WinMain