• Thứ Ba, 20/07/2004 16:27 (GMT+7)

    Câu hỏi :
    Xin hướng dẫn doạn code thực hiện quay số điện thoại trong VB 6.

    Trả lời :

    Microsoft đã hiện thực thư viện WinInet chứa các hàm cho phép dial-up tới server, các hàm truy xuất server... Tuy nhiên các hàm thực hiện dial-up như InternetAttemptConnect(), InternetDial(), InternetAutoDial() trong thư viện này đều thực hiện dial-up tới Account mặc định, nếu muốn thay đổi thông tin về server thì chính người dùng phải nhập liệu vào cửa sổ "Connect To". Lưu ý rằng để dialup, người dùng cần nhập vào 3 thông tin: Username, Password, Phone number (xem hình).

    Như vậy, các hàm trong thư viện WinInet không cho phép bạn thực hiện nối kết tự động đến server bất kỳ với account bất kỳ. Do đó chúng tôi có viết dùm bạn 1 thư viện chứa hàm DialupTo(param), hàm này sẽ tự động nối kết đến server thông qua account được qui định trong chuỗi tham số "param". Ý tưởng của hàm DialupTo() mà chúng tôi hiện thực là tạo 1 thread mới chạy song song với hàm này rồi gọi hàm InternetAttemptConnect() để hiển thị cửa sổ dial-up. Nhiệm vụ của thread chạy song song với hàm DialupTo là giám sát xem lúc nào cửa sổ "Connect To" hiển thị để giả lập người dùng nhập các tham số của server và account theo yêu cầu của ứng dụng vào các textbox trong cửa sổ, cuối cùng giả lập nhấn nút chọn button "Connect" để ra lệnh dial-up theo các tham số qui định.

    Sau đây là đoạn code VB miêu tả việc dùng hàm DialupTo() để tự động nối kết đến server theo yêu cầu tại từng thời điểm:

    ' Khai báo hàm DialupTo để sử dụng

    Private Declare Function DialupTo Lib "C:\samples\MFC\DialupLib\Debug\DialupLib.dll" (ByVal lpText As String) As Long

    ' Hàm demo việc dialup tự động

    Private Sub Command1_Click()

    Dim s As String

    Dim Username As String

    Dim Password As String

    Dim TelNum As String

    Dim ret As Long

       Username = "vnn1269"

       Password = "vnn1269"

       TelNum = "1269"

       ' xây dựng chuỗi tham số gồm UserName, Password và số điện thoại của server.

       s = Username & "," & Password & "," & TelNum

       ' gọi hàm DialupTo để dialup tự động đến server

       ret = DialupTo(s)

    End Sub

    Sau đây là đoạn code VC++ miêu tả sự hiện thực của hàm DialupTo() trong thư viện của chúng tôi:

    // Hiện thực hàm DialupTo : dialup tự động.

    long _stdcall DialupTo(char* param) {

        DWORD dwThreadId;

        HANDLE hThread;

        // tạo thread mới thực hiện hàm UpdateAccount() song song.

        hThread = CreateThread(

            NULL,   // no security attributes

            0,      // use default stack size 

            (LPTHREAD_START_ROUTINE)UpdateAccount,   // thread function

            (void*)param,  // argument to thread function

            0,             // use default creation flags

            &dwThreadId);  // returns the thread identifier

        // hiển thị cửa sổ dialup rồi chờ user đáp ứng

        // nhưng hàm UpdateAccount dưới đây sẽ giả lập user.

        if (InternetAttemptConnect(NULL) != ERROR_SUCCESS)

                  return 0;

        else return 1;

    }

    // hàm giả lập user để nhập tự động các thông tin về server

    DWORD WINAPI UpdateAccount(LPSTR lpParam) {

    HWND hwnd;

    int vkey, scode;

       // chờ cửa sổ "Connect To" hiển thị

       while ((hwnd=FindWindow(NULL, "Connect To"))==NULL);

       // cho phép cửa sổ "Connect To" giao tiếp với user

       SetForegroundWindow(hwnd);

       SetFocus(hwnd);

       // tạm dừng 300ms để cửa sổ "Connect To" ổn định

       Sleep(300);

       // nhập tự động Alt-U để dời cursor về textbox "UserName"

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

       keybd_event('U',MapVirtualKey('U',0),0,0);

       keybd_event('U',MapVirtualKey('U',0),KEYEVENTF_KEYUP,0);

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

       // nhập tự động thông tin username

       while (*lpParam && *lpParam!=',') {

                 vkey = toupper(*lpParam); scode = MapVirtualKey(vkey,0);

                 keybd_event(vkey,scode,0,0);

                 keybd_event(vkey,scode,KEYEVENTF_KEYUP,0);

                 lpParam++;

       }

       // chuẩn bị thông tin "Password" trong chuỗi

       if (*lpParam) lpParam++;

       // tạm dừng 300ms để cửa sổ "Connect To" ổn định

       Sleep(300);

       // nhập tự động Alt-P để dời cursor về textbox "Password"

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

       keybd_event('P',MapVirtualKey('P',0),0,0);

       keybd_event('P',MapVirtualKey('P',0),KEYEVENTF_KEYUP,0);

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

       // nhập tự động thông tin password

       while (*lpParam && *lpParam!=',') {

                 vkey = toupper(*lpParam); scode = MapVirtualKey(vkey,0);

                 keybd_event(vkey,scode,0,0);

                 keybd_event(vkey,scode,KEYEVENTF_KEYUP,0);

                 lpParam++;

       }

       // chuẩn bị thông tin "Phone number" trong chuỗi

       if (*lpParam) lpParam++;

       // tạm dừng 300ms để cửa sổ "Connect To" ổn định

       Sleep(300);

       // nhập tự động Alt-N để dời cursor về textbox "Phone number"

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

       keybd_event('N',MapVirtualKey('N',0),0,0);

       keybd_event('N',MapVirtualKey('N',0),KEYEVENTF_KEYUP,0);

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

       // nhập tự động thông tin "phone number"

       while (*lpParam && *lpParam!=',') {

                 vkey = *lpParam; scode = MapVirtualKey(vkey,0);

                 keybd_event(vkey,scode,0,0);

                 keybd_event(vkey,scode,KEYEVENTF_KEYUP,0);

                 lpParam++;

       }

       // tạm dừng 300ms để cửa sổ "Connect To" ổn định

       Sleep(300);

       // nhập tự động phím TAB để dời cursor về button "Connect"

       keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),0,0);

       keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),KEYEVENTF_KEYUP,0);

       // tạm dừng 300ms để cửa sổ "Connect To" ổn định

       Sleep(300);

       // nhập tự động phím Enter để bắt đầu dialup

       keybd_event(VK_RETURN,MapVirtualKey(VK_RETURN,0),0,0);

       keybd_event(VK_RETURN,MapVirtualKey(VK_RETURN,0),KEYEVENTF_KEYUP,0);

       return 0;

    }

    Bạn có thể liên hệ với tòa soạn TGVT -  PCWorld để copy Project VC++ cùng các file source code của thư viện chứa hàm DialupTo() được miêu tả ở trên. 

    Chuyên mục: Mạng - truyền thông