• Thứ Tư, 24/12/2003 10:30 (GMT+7)

    Câu hỏi :
    Tôi có vấn đề trong lập trình C++ với Word. Giả sử Application của tôi có được handle của MS Word, tôi thử gửi messages (phỏng theo cách nhấn bàn phím Ctrl+A, Ctrl+C) đến cửa sổ của Word, nhưng các lệnh này hoàn toàn không được thực hiện và chỉ thấy trong cửa sổ của Word có thêm hai ký tự A, C, phím Ctrl không có tác dụng gì.

    Trả lời :

      Bạn không liệt kê đoạn code cụ thể mà bạn đã viết nên chúng tôi không thể chỉ ra lỗi cụ thể. Về nguyên tắc, bạn có thể lập trình giả lập các phím nhấn để copy dữ liệu của ứng dụng Word (hay bất kỳ ứng dụng nào khác). Sau đây là đoạn code VC++ cho phép copy toàn bộ cửa sổ văn bản Word về ứng dụng của mình thông qua việc giả lập các trình tự phím tắt là Ctrl-A để chọn toàn bộ văn bản và Ctrl-C để copy vùng chọn vào clipboard :

     

    // giả sử handle của Word nằm trong biến hWnd

    // gởi thông báo để mở cửa sổ Word nếu Word đang ở dạng icon

    SendMessage(hWnd, WM_COMMAND, SC_MAXIMIZE, 0);

    //xóa clipboard của Word

                OpenClipboard(hWnd);  

                EmptyClipboard();

                CloseClipboard();

                // delay 150ms để chờ thi hành lệnh xóa clipboard

                SleepEx(150,FALSE);

    // gởi Ctrl-A để”Select All” document Word

    keybd_event (VK_CONTROL, 0, 0, 0);

                keybd_event (‘A’, 0, 0, 0);

                keybd_event (‘A’, 0, KEYEVENTF_KEYUP, 0);

    keybd_event (VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

    // gởi Ctrl-C để copy vùng chọn vào clipboard

    keybd_event (VK_CONTROL, 0, 0, 0);

    keybd_event (‘C’, 0, 0, 0);

                keybd_event (‘C’, 0, KEYEVENTF_KEYUP, 0);

    keybd_event (VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

    // delay 500ms để chờ thi hành lệnh copy

                SleepEx(500,FALSE);

    //đọc nội dung văn bản clipboard

                CString DataClip;          

                OpenClipboard(NULL);

                if(IsClipboardFormatAvailable(CF_TEXT)) {

                            HANDLE hData = GetClipboardData(CF_TEXT);

                            LPSTR lpData = (LPSTR)GlobalLock(hData);

                            DataClip=lpData;

                            GlobalUnlock(hData);                            

                }

                CloseClipboard();

    if(Data.GetLength() !=0 ) { // có data

                            // truy xuất dữ liệu từ chuỗi DataClip;

    }

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