Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 13
  1. #1

    có 2 WM_KEYDOWN trong 1 lần nhấn phím?

    Mã:
    #include <WINDOWS.h>MSG msgd;HHOOK adres;LRESULT CALLBACK fillfunc(int code,WPARAM wparam,LPARAM lparam){    if((code==HC_ACTION)&&(!(lparam>>31))){    MessageBox(NULL,"keydown","notice",MB_OK);    }else{ return CallNextHookEx(NULL,code,wparam,lparam);}    return CallNextHookEx(NULL,code,wparam,lparam);}int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ){    adres=SetWindowsHookEx(13,fillfunc,hInstance,0);    while(GetMessage(&msgd,NULL,0,0)){        TranslateMessage(&msgd);        DispatchMessage(&msgd);    }    UnhookWindowsHookEx(adres);    return 0 ;}
    chạy chương trình trên ấn 1 phím ra 2 cái MessageBox có ai biết vì sao không giúp em với.

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    em đã giải quyết được vấn đề trên nhưng giờ em có thêm một câu hỏi la vi sao em sử dụng KBDLLHOOKSTRUCT lại báo lỗi 'KBDLLHOOKSTRUCT' : undeclared identifier' mặc dù đã include<winuser.h>
    nhưng vẫn không được

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Mã:
    #include <WINDOWS.h>MSG msgd;HHOOK adres;LRESULT CALLBACK fillfunc(int code,WPARAM wparam,LPARAM lparam){    if((code==HC_ACTION)&&(!(lparam>>31))){    MessageBox(NULL,"keydown","notice",MB_OK);    }else{ return CallNextHookEx(NULL,code,wparam,lparam);}    return CallNextHookEx(NULL,code,wparam,lparam);}int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ){    adres=SetWindowsHookEx(13,fillfunc,hInstance,0);    while(GetMessage(&msgd,NULL,0,0)){        TranslateMessage(&msgd);        DispatchMessage(&msgd);    }    UnhookWindowsHookEx(adres);    return 0 ;}
    chạy chương trình trên ấn 1 phím ra 2 cái MessageBox có ai biết vì sao không giúp em với.
    Thêm "điều kiện" này nữa trong if:

    Mã:
    (DWORD)lParam & 0x40000000
    là được (nhớ là && với các điều kiện trên nhé).


    em đã giải quyết được vấn đề trên nhưng giờ em có thêm một câu hỏi la vi sao em sử dụng KBDLLHOOKSTRUCT lại báo lỗi 'KBDLLHOOKSTRUCT' : undeclared identifier' mặc dù đã include<winuser.h>
    nhưng vẫn không được
    Thử lại với typedef xem??

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bạn sửa bấm 1 phím ra 2 lần MessageBox như thế nào ? Mình cũng bị giống vậy [IMG]images/smilies/21.gif[/IMG]

  5. #5
    Peter đã chỉ phía trên rồi đấy chứ! Cậu đọc lại.

  6. #6
    oh .. nó chạy đúng rồi ... Peter ơi, tại sao phải thêm cái điều kiện đó vào thế ?

  7. #7
    Ngày tham gia
    Sep 2015
    Đang ở
    24 Rạch Bùng Binh , P10,Q3 , HCM
    Bài viết
    0
    Cậu cứ xem MSDN sẽ rõ, khi cậu nhấn thì cuối cùng cũng phải nhả phím! Vậy thì cái cậu cần là WM_KEYDOWN hay WM_KEYUP??? Vì thế nên phải lọc bằnng thằng lParam.

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Tớ muốn bắt mousewheel trong khi đang bấm ctrl thì phải làm thế nào hả peter?

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Nếu mình sử dung WH_KEYBOARD_LL thì wParam của nó để xác định là keyup hay keydown(Mình đọc ở trong MSDN thấy nó ghi là vậy).
    Còn sử dụng WH_KEYBOARD thì wParam dùng để xác định phím của mình. Nên mình làm thử cái của peter là (DWORD) lParam & 0x40000000. Thấy nó vẫn ra 2 cái messagebox nhưng lúc xác định wParam == 0x0100 thì nó chỉ xác định keydown thôi.
    Đúng không Peter nhỉ?

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    wa cái topic này em lập một năm rồi mà vẫn còn đông vui we.Hồi trước em viết cái này thật ra la một con Keylog đơn giản , vì muốn gọn nhẹ nên mới dùng cái WH_KEYBOARD_LL nay để khỏi phải đụng tới dll nhưng lại gặp vấn đề bấm 1 cái ra 2 cái .Đợi lâu quá không thấy ai rep đành lên google search và cuối cùng tìm được trang này : http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    Thấy trong đó có phần nói về cái biến wparam :
    Mã:
    wParam [in]
    
        Type: WPARAM
    
        The identifier of the keyboard message. This parameter can be one of the following messages: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP.
    Đọc xong mới hiểu ra là wparam là biến để xác định messages ,cuối cùng đổi điều kiện thành
    Mã:
    if((ncode==HC_ACTION)&&(wparam==WM_KEYDOWN))//chỉ lấy các kí tự thường bỏ các phím hệ thống
    thì nó chạy đúng .Còn cái 'KBDLLHOOKSTRUCT' : undeclared identifier' sửa hoài không được nên lên MSDN bợ luôn cái typedef của nó vào
    Mã:
    typedef struct tagKBDLLHOOKSTRUCT {
      DWORD     vkCode;
      DWORD     scanCode;
      DWORD     flags;
      DWORD     time;
      ULONG dwExtraInfo; //chổ này trên MSDN là ULONG_PTR nhưng tren VC6++ không thấy đành đổi lại thành ULONG
    } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT, *LPKBDLLHOOKSTRUCT;

 

 
Trang 1 của 2 12 CuốiCuối

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
  •