keybd_event VK_MENU, 0, 0, 0 nhấn và giữ Alt)

keybd_event 96, 0, 0, 0 (nhấn 0)

keybd_event 96, 0, KEYEVENTF_KEYUP, 0(nhả 0)

keybd_event 98, 0, 0, 0 (nhấn 2)

keybd_event 98, 0, KEYEVENTF_KEYUP, 0(nhả 2)

keybd_event 98, 0, 0, 0 (nhấn 2)

keybd_event 98, 0, KEYEVENTF_KEYUP, 0(nhả 2)

keybd_event 101, 0, 0, 0 (nhấn 5)

keybd_event 101, 0,KEYEVENTF_KEYUP,0(nhả 5)

keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0 (nhả Alt)

nhưng khi thực hiện chương trình thì hoàn toàn không có kí tự nào cả (gõ trong MSWord2003). Nếu nhấn và gõ Alt +0225 trực tiếp trong Word thì vẫn hiện ra chữ "á" bình thường. Nếu dùng sendkeys("á") hoặc sendkeys(chr(225)) thì có chương trình nhận được, chương trình không. Xin hướng dẫn cách để đưa các kí tự chữ Việt vào luồng nhập.

" />
  • Thứ Sáu, 06/08/2004 14:07 (GMT+7)

    Câu hỏi :

    Tôi có một chương trình câu (hook) bàn phím viết bằng VB6 trong WinXP. Ý tưởng là khi nhấn "a" + "1" thì mô tả nhấn phím là "Alt"+ "0" + "2" + "2" + "5" (mã tương ứng với chữ "á") bằng dòng lệnh sau: 

    keybd_event VK_MENU, 0, 0, 0 nhấn và giữ Alt)

    keybd_event 96, 0, 0, 0 (nhấn 0)

    keybd_event 96, 0, KEYEVENTF_KEYUP, 0(nhả 0)

    keybd_event 98, 0, 0, 0 (nhấn 2)

    keybd_event 98, 0, KEYEVENTF_KEYUP, 0(nhả 2)

    keybd_event 98, 0, 0, 0 (nhấn 2)

    keybd_event 98, 0, KEYEVENTF_KEYUP, 0(nhả 2)

    keybd_event 101, 0, 0, 0 (nhấn 5)

    keybd_event 101, 0,KEYEVENTF_KEYUP,0(nhả 5)

    keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0 (nhả Alt)

    nhưng khi thực hiện chương trình thì hoàn toàn không có kí tự nào cả (gõ trong MSWord2003). Nếu nhấn và gõ Alt +0225 trực tiếp trong Word thì vẫn hiện ra chữ "á" bình thường. Nếu dùng sendkeys("á") hoặc sendkeys(chr(225)) thì có chương trình nhận được, chương trình không. Xin hướng dẫn cách để đưa các kí tự chữ Việt vào luồng nhập.



    Trả lời :

    Có nhiều phương pháp giả lập nhập liệu cho ứng dụng, trong đó phương pháp gọi hàm API keybd_event() có tính tương thích tốt nhất cho mọi phần mềm. Khi gọi hàm keybd_event(), bạn nên chú ý cẩn thận 2 vấn đề sau:

    Trước khi gọi hàm keybd_event(), bạn phải thiết lập cửa sổ nhập liệu đúng (cửa sổ active hay focus). Đoạn code VC++ sau đây cho phép bạn thiết lập cửa sổ nhập liệu là cửa sổ Word:

    // tìm cửa sổ Word cần nhập liệu

    HWND hwnd;

    if ((hwnd=FindWindow("OpusApp", NULL))==NULL) {

        MessageBox("Không tìm được cửa sổ Word", "Error",NULL, MB_OK);

        return;

    }

    // đưa cửa sổ Word về chế độ focus để nhận dữ liệu nhập

    SetForegroundWindow(hwnd);

    SetFocus(hwnd);

    // dừng chờ 300ms để cửa sổ Word ổn định

    Sleep(300);

    Hàm keybd_event() đòi hỏi 4 tham số, trong đó 3 tham số đầu bắt buộc phải truyền đúng là: mã virtual code của phím ấn, mã scancode của phím ấn, cờ hiệu miêu tả sự kiện ấn/thả phím.

    Đoạn code gọi hàm keybd_event() của bạn không có tác dụng vì các tham số truyền không đúng, thí dụ mã virtual code của từng phím số mà bạn dùng là mã virual code của các phím số bình thường chứ không phải của các phím số trên dàn NumPad, bạn không dùng đúng mã scancode cho phím số. Sau đây là hàm Make_Key() viết bằng VC++ cho phép bạn nhập tự động 1 mã ký tự bất kỳ:

    // định nghĩa 2 vector chứa mã virtual code và sacncode của các phím số trên dàn NumPad

    BYTE NumpadVirKey[10] = {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69};

    BYTE NumpadScancode[10] = {0x52,0x4f,0x50,0x51,0x4b,0x4c,0x4d,0x47,0x48,0x49};

    // hàm nhập tự động mã ký tự bằng trình tự Alt-0ddd

    // trong đó code=ddd là mã ký tự cần nhập

    void Make_Key(BYTE code) {

    short digit;

       // ấn tự động phím Alt

       keybd_event(VK_MENU,0x38,0,0);

       // ấn tự động phím 0 ở Numpad

       keybd_event(VK_NUMPAD0,0x52,0,0);

       keybd_event(VK_NUMPAD0,0x52,KEYEVENTF_KEYUP,0);

       // xác định ký số hàng trăm & nhập tự động nó

       digit = code/100; code = code%100;

       if (digit) {

                keybd_event(NumpadVirKey[digit],NumpadScancode[digit],0,0);

                keybd_event(NumpadVirKey[digit],NumpadScancode[digit], KEYEVENTF_KEYUP,0);

       }

       // xác định ký số hàng chục và nhập tự động nó

       digit = code/10; code = code%10;

       // nhập tự động ký số hàng chục

       keybd_event(NumpadVirKey[digit],NumpadScancode[digit],0,0);

       keybd_event(NumpadVirKey[digit],NumpadScancode[digit], KEYEVENTF_KEYUP,0);

       // nhập tự động ký số hàng đơn vị

       digit = code;

       keybd_event(NumpadVirKey[digit],NumpadScancode[digit],0,0);

       keybd_event(NumpadVirKey[digit],NumpadScancode[digit], KEYEVENTF_KEYUP,0);

       // thả tự động phím Alt

       keybd_event(VK_MENU,0x38,KEYEVENTF_KEYUP,0);

    }

    Chuyên mục: Lập trình