回覆java_gh的一個問題

simpleman7210發表於2013-08-15

我看到java_gh在CSDN C/C++版塊的一個問題,因為是初學者所提問題,我就熱心幫助一次。但並不表示我贊同那種做法。

唉,那種程式設計,是不走正路的。初學者做這種東西,不利於學到真正知識,也不利於培養對程式設計的興趣。因為這是一種hack式程式設計。

如果掃雷程式沒有公開二次開發介面,只有通過給掃雷視窗發訊息的方式,但你心裡要知道這種做法是不正規的。我沒有直接在原貼上回復,

因為看到有人的回覆象刷屏撈分,就不願意跟在後面回覆了。

 

下面是傳送訊息來觸發掃雷程式自定義設定的程式碼:

    HWND h = ::FindWindow(NULL,_T("掃雷"));
    if (h == NULL) {
        AfxMessageBox(_T("失敗"));
        return;
    }
    CWnd *wnd = CWnd::FromHandle(h);
    CMenu *menu = wnd->GetMenu();
    CMenu *s = menu->GetSubMenu(0);
    ::PostMessage(h, WM_COMMAND, MAKELONG(s->GetMenuItemID(5),0), 0);
    Sleep(200);
    HWND hWndCustom = ::FindWindow(NULL, _T("自定義雷區"));
    if (hWndCustom == NULL) {
        AfxMessageBox(_T("失敗"));
        return;
    }
    CWnd *wndCustom = CWnd::FromHandle(hWndCustom);
    TCHAR *s1 = _T("20");
    TCHAR *s2 = _T("30");
    TCHAR *s3 = _T("100");
    CWnd *ctrl1 = wndCustom->GetDlgItem(0x8D);
    if (ctrl1) {
        ctrl1->SendMessage(WM_SETTEXT, 0, (LPARAM)s1);
    }
    CWnd *ctrl2 = wndCustom->GetDlgItem(0x8E);
    if (ctrl2)
        ctrl2->SendMessage(WM_SETTEXT, 0, (LPARAM)s2);

    CWnd *ctrl3 = wndCustom->GetDlgItem(0x8F);
    if (ctrl3)
        ctrl3->SendMessage(WM_SETTEXT, 0, (LPARAM)s3);

    //模擬使用者點選確定按鈕
    CWnd *ctrlOK = wndCustom->GetDlgItem(1);
    if (ctrlOK)
        ctrlOK->PostMessage(BM_CLICK, 0, 0);

簡單說明一下:先找到掃雷程式的主視窗,上面的程式碼是通過FindWindow找到掃雷視窗。如果你已經通過某種方式得到了,就直接用視窗控制程式碼操作,不必用FindWindow了。接著是模擬點選選單項“自定義”,它是在“遊戲”選單的第5項。若成功則自定義掃雷視窗應該出現。接下來就是給三個edit視窗傳送訊息,把具體數值填進去,你要把上面的例子數值替換成你要的值。為什麼三個edit的control ID是0x8D, 0x8E, 0x8F?因為我通過VC自帶的spy工具看到的。如果不能工作,你要在自己的機器上用spy工具看看,給出實際的值。最後是模擬按鈕點選訊息。

相關文章