怎么在MFC中捕获一个窗口,并后台让他按某个按钮? 如题,我有个MFC程序要捕获另一个程序弹出的消息窗口,窗口有“Yes”和“NO”按钮,我想实现程序自动选择Yes按钮来继续运行……请问怎么实现?谢谢~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、查找窗口:HWND hDest = FindWindow(...);2、模拟鼠标按键:::PostMessage(hDest, WM_LBUTTONDOWN, wparam, lparam);::PostMessage(hDest, WM_LBUTTONUP, wparam, lparam); 这个方法可行,不过你是想让MFC程序在没有焦点也能随时捕捉的话,用全局钩子吧 您这里好像没看到怎么选择Yes按钮喔 怎么个正解法?里面都没说怎么选择yes button,而且它默认的按钮是"No" 要选择哪个按钮,是在EnumWindows的回调函数里面来判断的(可能这里让你混淆了)。找到窗口句柄之后,直接向这个窗口发消息,就不存在哪个是默认的了。struct tagFW{ HWND hwnd; TCHAR tcTitle[80];}FW, *LPFW;BOOL CALLBACK EnumWindowsProc(HWND hwnd/*当前找到的窗口句柄*/, LPARAM lParam/*自定义参数*/){ TCHAR tcTitle[256]; LPFW pFW = (LPFW)lParam; ::GetWindowText(hwnd, tcTitle, sizeof(tcTitle) / sizeof(tcTitle[0]); if( _tcsicmp(tcTitle, pFW->tcTitle) == 0 ) { // 找到,保存参数并终止查找 pFW->hwnd = hwnd; return FALSE; } else { return TRUE; }}CYourDlg::OnBnClickedFindWindow(){ FW fw = {NULL, _T("Yes")}; EnumWindows(EnumWindowsProc, (LPARAM)&fw); // 发消息。。两个消息参数自己查阅MSDN ::PostMessage(fw.hwnd, WM_LBUTTONDOWN, wparam, lparam); ::PostMessage(fw.hwnd, WM_LBUTTONUP, wparam, lparam);} 1、查找窗口:HWND hDest = FindWindow(...); 2、查找按钮:HWND hbtn = FindWindowEx(hDest ,..); 2、模拟鼠标按键: ::PostMessage(hbtn , WM_LBUTTONDOWN, wparam, lparam); ::PostMessage(hbtn , WM_LBUTTONUP, wparam, lparam); API:FindWindow() 找到那个窗口的句柄API:GetDlgItemID()找到那个窗口中你要的那个按钮的句柄(前提是,要用spy++先找到那个按钮在窗口中的控件ID)API:SendMessage() 根据那个按钮的句柄发送一个WM_COMMAND消息即可 ::PostMessage(fw.hwnd, WM_LBUTTONDOWN, wparam, lparam); wparam,与lparam两个变量是什么来的,要定义阿!! 我就直接像下面定义??WPARAM wparam;LPARAM lparam;但这样定义了有啥意义??什么时候用到它?? 服了你们,没MSDN吗?CYourDlg::OnBnClickedFindWindow(){ FW fw = {NULL, _T("Yes")}; EnumWindows(EnumWindowsProc, (LPARAM)&fw); // 发消息。。两个消息参数自己查阅MSDN ::PostMessage(fw.hwnd, WM_LBUTTONDOWN, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1)); ::PostMessage(fw.hwnd, WM_LBUTTONUP, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1)); } 可能我结帖快了点了:下面是我的代码,可是却不能实现功能:typedef struct tagFW{ HWND hwnd; TCHAR tcTitle[80];}FW, *LPFW;BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam){ TCHAR tcTitle[1024]; LPFW pFW = (LPFW)lParam; ::GetWindowText(hwnd, tcTitle, sizeof(tcTitle) / sizeof(tcTitle[0])); if( _tcsicmp(tcTitle, pFW->tcTitle) == 0 ) { pFW->hwnd = hwnd; return FALSE; } else { return TRUE; }}void CAddDlg::OnClosebtn() { FW fw = {NULL, _T("Yes")}; EnumWindows(EnumWindowsProc, (LPARAM)&fw); ::PostMessage(fw.hwnd, WM_LBUTTONDOWN, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1)); ::PostMessage(fw.hwnd, WM_LBUTTONUP, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1)); }希望全能的vcPlayer 能继续帮我看一下问题所在呀~ 如何识别两种声音是否相同? 如何读取网络摄像头缓存中的数据? 请教WM_DEVICECHANGE能不能从客户端发送到远程登录的服务器上呢? 写代码改变CTreeCtrl的Style的问题 VC++安装 请问在MFC下如何定义和使用全局变量? 我也來放分。。(1/10) 高手的世界,尽显英雄的本色,英雄请留步,在下有话要说! 请问如何在一文件中定位指定字符串的? MFC MDI 分割窗口总是出现断言操作,但是在SDI中是正确的?请问大神~~ 使用UDP协议从服务器发送数据到客户端的问题 已经封装好一个CMyButton, 怎么通过HOOK来实现子类化.
::PostMessage(hDest, WM_LBUTTONDOWN, wparam, lparam);
::PostMessage(hDest, WM_LBUTTONUP, wparam, lparam);
您这里好像没看到怎么选择Yes按钮喔
要选择哪个按钮,是在EnumWindows的回调函数里面来判断的(可能这里让你混淆了)。找到窗口句柄之后,直接向这个窗口发消息,就不存在哪个是默认的了。struct tagFW
{
HWND hwnd;
TCHAR tcTitle[80];
}FW, *LPFW;
BOOL CALLBACK EnumWindowsProc(HWND hwnd/*当前找到的窗口句柄*/, LPARAM lParam/*自定义参数*/)
{
TCHAR tcTitle[256];
LPFW pFW = (LPFW)lParam; ::GetWindowText(hwnd, tcTitle, sizeof(tcTitle) / sizeof(tcTitle[0]);
if( _tcsicmp(tcTitle, pFW->tcTitle) == 0 )
{
// 找到,保存参数并终止查找
pFW->hwnd = hwnd;
return FALSE;
}
else
{
return TRUE;
}
}CYourDlg::OnBnClickedFindWindow()
{
FW fw = {NULL, _T("Yes")};
EnumWindows(EnumWindowsProc, (LPARAM)&fw); // 发消息。。两个消息参数自己查阅MSDN
::PostMessage(fw.hwnd, WM_LBUTTONDOWN, wparam, lparam);
::PostMessage(fw.hwnd, WM_LBUTTONUP, wparam, lparam);
}
::PostMessage(hbtn , WM_LBUTTONDOWN, wparam, lparam);
::PostMessage(hbtn , WM_LBUTTONUP, wparam, lparam);
API:GetDlgItemID()找到那个窗口中你要的那个按钮的句柄(前提是,要用spy++先找到那个按钮在窗口中的控件ID)
API:SendMessage() 根据那个按钮的句柄发送一个WM_COMMAND消息即可
wparam,与lparam两个变量是什么来的,要定义阿!!
我就直接像下面定义??
WPARAM wparam;
LPARAM lparam;
但这样定义了有啥意义??
什么时候用到它??
{
FW fw = {NULL, _T("Yes")};
EnumWindows(EnumWindowsProc, (LPARAM)&fw); // 发消息。。两个消息参数自己查阅MSDN
::PostMessage(fw.hwnd, WM_LBUTTONDOWN, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1));
::PostMessage(fw.hwnd, WM_LBUTTONUP, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1));
}
下面是我的代码,可是却不能实现功能:typedef struct tagFW
{
HWND hwnd;
TCHAR tcTitle[80];
}FW, *LPFW;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR tcTitle[1024];
LPFW pFW = (LPFW)lParam; ::GetWindowText(hwnd, tcTitle, sizeof(tcTitle) / sizeof(tcTitle[0]));
if( _tcsicmp(tcTitle, pFW->tcTitle) == 0 )
{
pFW->hwnd = hwnd;
return FALSE;
}
else
{
return TRUE;
}
}void CAddDlg::OnClosebtn()
{
FW fw = {NULL, _T("Yes")};
EnumWindows(EnumWindowsProc, (LPARAM)&fw); ::PostMessage(fw.hwnd, WM_LBUTTONDOWN, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1));
::PostMessage(fw.hwnd, WM_LBUTTONUP, WPARAM(MK_LBUTTON), MAKELPARAM(1, 1));
}
希望全能的vcPlayer 能继续帮我看一下问题所在呀~