Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 3 của 3
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Sử dụng Hook WH_CALLWNDPROC, hok chạy đc

    Mình cài một hàm lọc như sau với nội dung là : khi người dùng nhấn phím thì gán message đó thành WM_LBUTTONDOWN và gọi một thủ thục windows MyProc do mình cài đặt, nhưng hok hiểu sao, câu lệnh if để kiểm tra thì đk luôn luôn false :

    Mã:
    LRESULT CALLBACK CallWindowsProc(int iCode,WPARAM wparam,LPARAM lparam){    PCWPSTRUCT cwp = (PCWPSTRUCT)(lparam);    if((iCode==HC_ACTION) && (cwp->message==WM_KEYDOWN))// nếu người dùng nhấn 1 phím    {        cwp->message=WM_LBUTTONDOWN;        CallWindowProc((WNDPROC)MyProc,cwp->hwnd,cwp->message,cwp->wParam,cwp->lParam);    //  return CallNextHookEx(hook,iCode,wparam,lparam);            }        return CallNextHookEx(hook,iCode,wparam,lparam);}
    Code full :



    Mã:
    #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;LRESULT CALLBACK MyProc (HWND, UINT, WPARAM, LPARAM) ;LRESULT WINAPI CallWindowsProc(int,WPARAM,LPARAM);HHOOK hook;HWND hWnd;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_ICONERROR) ;          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) ;     hWnd = hwnd;     hook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWindowsProc,hInstance,GetCurrentThreadId());      while (GetMessage (&msg, NULL, 0, 0))     {          TranslateMessage (&msg) ;          DispatchMessage (&msg) ;     }     return 1;} LRESULT CALLBACK MyProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){     HDC         hdc ;     PAINTSTRUCT ps ;     RECT        rect ;          switch (message)     {     case WM_CREATE:          //PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;          return 0 ;     case WM_KEYDOWN:          MessageBox(NULL,TEXT("MyProc is proceed,WM_KEYDOWN"),TEXT("MyProc "),0);          return 0;     case WM_LBUTTONDOWN:          MessageBox(NULL,TEXT("MyProc is proceed,WM_LBUTTONDOWN"),TEXT("MyProc "),0);          return 0;     case WM_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:          UnhookWindowsHookEx(hook);          PostQuitMessage (0) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;} LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){     HDC         hdc ;     PAINTSTRUCT ps ;     RECT        rect ;          switch (message)     {     case WM_CREATE:          //PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;          return 0 ;               break;    case WM_KEYDOWN:          MessageBox(NULL,TEXT("Wndproc is proceed,WM_KEYDOWN"),TEXT("wndproc"),0);          return 0;    case WM_LBUTTONDOWN:          MessageBox(NULL,TEXT("Wndproc is proceed,WM_LBUTTONDOWN"),TEXT("wndproc"),0);          return 0;      case WM_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) ;}LRESULT CALLBACK CallWindowsProc(int iCode,WPARAM wparam,LPARAM lparam){    PCWPSTRUCT cwp = (PCWPSTRUCT)(lparam);    if((iCode==HC_ACTION) && (cwp->message==WM_KEYDOWN))    {        cwp->message=WM_LBUTTONDOWN;        CallWindowProc((WNDPROC)MyProc,cwp->hwnd,cwp->message,cwp->wParam,cwp->lParam);    //  return CallNextHookEx(hook,iCode,wparam,lparam);            }        return CallNextHookEx(hook,iCode,wparam,lparam);}

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Lưu ý với cậu: Hook WH_CALLWNDPROC chỉ cho phép cậu xử lý thông điệp, nó không cho phép cậu biến đổi thông điệp; nói như vậy có nghĩa rằng việc biến đổi thông điệp WM_KEYDOWN (thông điệp bàn phím) thành WM_LBUTTONDOWN (thông điệp chuột) coi như thất bại!; để đáp ứng được yêu cầu này tôi khuyên cậu chuyển về dạng Hook WH_KEYBOARD (cho phép chặn thông điệp bàn phím và có thể biến đổi hoặc loại bỏ bất cứ thông điệp bàn phím nào! (trừ Ctrl+Del+Alt); với Hook này cậu có thể thay
    Mã nguồn PHP:
    if((iCode==HC_ACTION) && (cwp->message==WM_KEYDOWN))  
    thành
    Mã nguồn PHP:
    if (((DWORD)lParam & 0x40000000) &&(HC_ACTION==iCode))  
    Hy vọng giúp ích được cho cậu!

  3. #3
    Ngày tham gia
    Sep 2015
    Đang ở
    hà nội
    Bài viết
    0
    Thanks bạn góp ý nhiều lắm, nhưng bạn ơi, vấn đề của mình chưa đc giải quyết, mình chỉ muốn biến WM_KEYDOWN thành WM_LBUTTONDOWN và yêu cầu thủ tục MyProc xử lý thôi, nhưng hok biết tại sao đk trong câu lệnh if luôn false:


    Mã:
    if((iCode==HC_ACTION) && (cwp->message==WM_KEYDOWN))    {        cwp->message=WM_LBUTTONDOWN;        CallWindowProc((WNDPROC)MyProc,cwp->hwnd,cwp->message,cwp->wParam,cwp->lParam);    //  return CallNextHookEx(hook,iCode,wparam,lparam);            }        return CallNextHookEx(hook,iCode,wparam,lparam);

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •