我看到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工具看看,给出实际的值。最后是模拟按钮点击消息。