非同期でキーを調べる

GetAsyncKeyState() で キーをセンスして ESC で中断します。
CPU が占有される処理では WM_LBUTTONDOWN: がなかなか検出されません。
このようなときに命令を実行した時点のキーの状態を教えてくれます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明です。

  1. 新規プロジェクトを作成して下さい。
    WM_COUNT はカウントをダウンする CALLBACK のIDです。
    count はカウンタで、この値がゼロになるとプログラムを終了します。
    buf[] はカウンタを編集して表示するための作業領域です。
    Stop はプログラムを終了するストップフラグです。
        #define     WM_COUNT    (WM_APP + 0)
        int         count= 3;
        char        buf[80];
        BOOL        Stop= FALSE;
        
  2. WM_PAINT: では count の値を編集して表示します。
    表示が終わると、count をダウンするために WM_COUNT をポストします。
        switch(msg)
        {   case WM_PAINT:
                hdc = BeginPaint(hWnd,&ps);
                wsprintf(buf,"COUNT= %d",count);
                TextOut(hdc,100,50,buf,strlen(buf));
                PostMessage(g_hWnd,WM_COUNT,(WPARAM)0,(LPARAM)0);
                EndPaint(hWnd,&ps);
                break;
        
  3. WM_COUNT: で count をダウンします。
    Stop が TRUE のときはプログラムを終了します。
    無駄なループや Sleep() 関数は CPU を占有する処理をテストするためです。
    count ダウンが終わると InvalidateRect() で画面に表示します。
            case WM_COUNT:
                if (Stop)   PostMessage(hWnd,WM_CLOSE,0,0);
                for(i=0; i<1000 && Stop==FALSE; i++)
                {   Sleep(10);
                }
                count--;
                if (count<1)    Stop= TRUE;
                InvalidateRect(hWnd,NULL,TRUE);
                return 0L;
        
  4. WM_KEYDOWN: で ESC キーを検出します。
    このプログラムでは ESC キーがなかなか効かないことを確かめて下さい。
            case WM_KEYDOWN:            //KEY が押された
                switch (wp)
                {   case VK_ESCAPE:     //ESC KEY
                        Stop= TRUE;
                        return 0L;
                }
                break;
        

【演習】

  1. プログラムを完成させて下さい。
  2. ESC キーを押し続けてキーの反応が遅いことを確認して下さい。
  3. GetAsyncKeyState() でキーをセンスします。
    1. ループの中で GetAsyncKeyState() で ESC キーを検出して下さい。
                  for(i=0; i<1000 && Stop==FALSE; i++)
                  {   Sleep(10);
                      if (GetAsyncKeyState(VK_ESCAPE)<0)  Stop= TRUE;
                  }
              
    2. WM_KEYDOWN: を削除して下さい。
  4. ESC キーを押すとプログラムがすぐに終了することを確かめて下さい。

超初心者のプログラム入門(Win32API C++)