yuxb57905 发表于 2020-11-25 09:54

windows api 按键响应机制

本帖最后由 yuxb57905 于 2020-11-26 01:15 编辑

#include <windows.h>
#pragma comment(lib, "winmm.lib")

WPARAM mymessage(HWND hwnd);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,      
                   PSTR szCmdLine, int iCmdShow)      
{      
    static TCHAR szAppName[] = TEXT ("HelloWin") ;      
    HWND   hwnd ;   
    MSG    msg ;
      
    WNDCLASS wndclass ;
    wndclass.style      = CS_HREDRAW | CS_VREDRAW ;      
    wndclass.lpfnWndProc= WndProc ;   
    wndclass.cbClsExtra   = 0 ;   
    wndclass.cbWndExtra   = 0 ;   
    wndclass.hInstance    = hInstance ;   
    wndclass.hIcon      = LoadIcon (NULL, IDI_APPLICATION) ;   
    wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW) ;   
    wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;      
    wndclass.lpszMenuName= NULL ;   
    wndclass.lpszClassName = szAppName ;
   
    if (!RegisterClass (&wndclass))      
    {   
            MessageBox (NULL, TEXT ("This program requires Windows NT!"),      
                                  szAppName, MB_OK) ;
   
            return 0 ;
    }   
    hwnd = CreateWindow( szAppName,      // window class name      
                   TEXT ("The Hello Program"),   // window caption      
                   WS_OVERLAPPEDWINDOW,// window style      
                   CW_USEDEFAULT,// initial x position      
                   CW_USEDEFAULT,// initial y position      
                   CW_USEDEFAULT,// initial x size      
                   CW_USEDEFAULT,// initial y size      
                   NULL,               // parent window handle      
                   NULL,            // window menu handle      
                   hInstance,   // program instance handle
                   NULL) ;      // creation parameters

    ShowWindow (hwnd, iCmdShow) ;   
    UpdateWindow (hwnd) ;      
    while (GetMessage (&msg, NULL, 0, 0))      
    {      
          TranslateMessage (&msg) ;      
          DispatchMessage (&msg) ;      
    }
       
    return msg.wParam ;      
}
      
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)      
{   
/* static*/ WPARAM      hmsg;
    HDC         hdc ;   
    PAINTSTRUCT ps ;   
    RECT      rect ;         
    switch (message)   
    {
                case WM_LBUTTONDOWN:
                       
                       MessageBox (NULL, TEXT ("一级左键!"),      
                        TEXT ("This program !"), MB_OK) ;
                       //SendMessage(hwnd,WM_RBUTTONDOWN,0,0);
                       return 0 ;
                        // switch(hmsg.message)
                        //{
                       case WM_KEYDOWN:
                                       hmsg = mymessage(hwnd);
                                       MessageBox (NULL, TEXT ("This program 二级键UP!"),      
                                                TEXT ("This program !"), MB_ICONERROR) ;
                     switch(hmsg)
                                       {
                                          case   VK_HOME:
                                                           MessageBox (NULL, TEXT ("This is home键!"),      
                                                                    TEXT ("This program !"), MB_ICONERROR) ;
                                                           break ;
                                                case   VK_NUMLOCK:
                                                           MessageBox (NULL, TEXT ("This is NUMLOCK键!"),      
                                                                                        TEXT ("This program !"), MB_ICONERROR) ;
                                                     break ;
                                       }
                                       
                           return 0 ;
                                
               
        case WM_RBUTTONDOWN:      
                       MessageBox (NULL, TEXT ("This program RRRRRR!"),      
                TEXT ("This program !"), MB_ICONERROR) ;
                SendMessage(hwnd,WM_KEYDOWN,0,0);
                SendMessage(hwnd,WM_CHAR,VK_HOME,0);
               
                SendMessage(hwnd,WM_KEYUP,0,0);
          return 0 ;

                case WM_CREATE:      
                       //PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
                       
                                return 0 ;

                caseWM_PAINT:      
                          hdc = BeginPaint (hwnd, &ps) ;
                          GetClientRect (hwnd, &rect) ;
                          DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,   
                                           DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;      
                          EndPaint (hwnd, &ps) ;   
                                return 0 ;
   
                case   WM_DESTROY:
                           PostQuitMessage (0) ;      
                                return 0 ;   
        }
       
return DefWindowProc (hwnd, message, wParam, lParam) ;      
}

WPARAM mymessage(HWND hwnd)
{
    MSG mymsg;
        mymsg.wParam =0;
       
        while(GetMessage (&mymsg, NULL, 0, 0)/*mymsg.wParam<VK_BACK||mymsg.wParam>VK_SCROLL*/)
        {
          
          TranslateMessage (&mymsg) ;
          if (mymsg.message == WM_KEYUP)
          {
         return (mymsg.wParam);
               break;
          }
          else
         DispatchMessage (&mymsg) ;
        }

        return 0;
}

qihang5518 发表于 2020-11-25 10:23

虽然看不懂,依然感谢分享

鸭子咯咯哒~ 发表于 2020-11-25 11:07

请问怎么创建控件(编辑框还有滚动条那些?)

mettle 发表于 2020-11-25 18:06

谢谢分享,学习一下控件机制!
页: [1]
查看完整版本: windows api 按键响应机制