我也是经过搜索论坛,找到一些例子,东摸摸西摸摸,然后成了下面这些代码功能是对话框上的一个按钮,想通过点击这个按钮执行一些准备后,就去点击一个按钮
目前我通过Spy知道了这个按钮的ID是204,但是这个软件窗口是有5个窗口的,有3个窗口是有组,
下面还有有些窗口,而我这个204的按钮是在第2组下面的一个窗口(不知道我对窗口的理解无错误?)然后我这段执行代码只能去历遍5个窗口,下面的子窗口是历遍不到的,所以都确定不下那个按钮句柄,
麻烦高手帮我一下,我折腾了一晚都搞不出来,能力水平所限void CokbyPSDlg::OnBnClickedButton2() //执行
{
/********************/
/*执行了一些过程,略*/
/********************/ HWND hwnd = FindWindow(NULL,_T("登记评审确定"));
//找到另外一个软件的目标窗口 HWND hChildWnd = ::GetWindow(hwnd, GW_CHILD); //开始找
while( hChildWnd!=NULL )
{
int nID = ::GetDlgCtrlID(hChildWnd);
CString kk;
kk.Format(L"%d",nID);
AfxMessageBox(kk);
//我通过消息窗口来看看逐个显示的ID
SendMessage(hChildWnd,WM_LBUTTONDOWN,0,0); //发点击
hChildWnd = ::GetWindow(hChildWnd, GW_HWNDNEXT);
}
//只历遍大窗口,小窗口历遍不到,所以看不到204这个窗口...}
目前我通过Spy知道了这个按钮的ID是204,但是这个软件窗口是有5个窗口的,有3个窗口是有组,
下面还有有些窗口,而我这个204的按钮是在第2组下面的一个窗口(不知道我对窗口的理解无错误?)然后我这段执行代码只能去历遍5个窗口,下面的子窗口是历遍不到的,所以都确定不下那个按钮句柄,
麻烦高手帮我一下,我折腾了一晚都搞不出来,能力水平所限void CokbyPSDlg::OnBnClickedButton2() //执行
{
/********************/
/*执行了一些过程,略*/
/********************/ HWND hwnd = FindWindow(NULL,_T("登记评审确定"));
//找到另外一个软件的目标窗口 HWND hChildWnd = ::GetWindow(hwnd, GW_CHILD); //开始找
while( hChildWnd!=NULL )
{
int nID = ::GetDlgCtrlID(hChildWnd);
CString kk;
kk.Format(L"%d",nID);
AfxMessageBox(kk);
//我通过消息窗口来看看逐个显示的ID
SendMessage(hChildWnd,WM_LBUTTONDOWN,0,0); //发点击
hChildWnd = ::GetWindow(hChildWnd, GW_HWNDNEXT);
}
//只历遍大窗口,小窗口历遍不到,所以看不到204这个窗口...}
解决方案 »
- Ribbon上的按钮,怎么响应ButtonDown和ButtonUp消息?
- 基于对话框主窗口设置风格
- IP_HDRINCL表示的意思是什么?
- VC访问access数据库条件查询语句中含字符串变量该怎样处理
- 如何让MFCGridCtrl控件实现自动换行
- 菜鸟求助:最近在弄一个小的游戏代理程序,大家来给点意见吧
- 尽全分求一个串口接收的高置,结果可行三分钟内结贴..
- 程序中使用多线程应用CSocket和CAsyncSocket,但大规模连接时容易出这个错...
- 在 Windows 窗体中如何获取与本机相连打印机的名称?求解
- ActiveX 还是十万火急来救我
- 急!求教Hook文件操作的问题!
- 帮忙看条语句
WNDENUMPROC lpEnumFunc,
LPARAM lParam
);
ParametershWndParent
[in] Handle to the parent window whose child windows are to be enumerated. If this parameter is NULL, this function is equivalent to EnumWindows.
Windows 95/98/Me: hWndParent cannot be NULL.lpEnumFunc
[in] Pointer to an application-defined callback function. For more information, see EnumChildProc.
lParam
[in] Specifies an application-defined value to be passed to the callback function.
SyntaxBOOL CALLBACK EnumChildProc( HWND hwnd,
LPARAM lParam
);
Parametershwnd
[in] Handle to a child window of the parent window specified in EnumChildWindows.
lParam
[in] Specifies the application-defined value given in EnumChildWindows.
Return ValueTo continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.
然后直接PostMessage这个按钮消息就可以
不用所谓模拟点击
HWND hwnd=::GetDlgItem(pHwnd,204);
::SendMessage(hwnd,WM_LBUTTONDOWN,0,0);很多情况你找不到按钮的ID,或者ID是不对的,像你上面遍历没什么必要,直接用spy++查这个按钮的父窗口,以及父窗口的父窗口....一层一层找下来就行了
PostMessage(hwndBtn,WM_LBUTTONDOWN,0,0);
Sleep(5);
PostMessage(hwndBtn,WM_LBUTTONUP,0,0);
PostMessage(HWND_PARENT, WM_COMMAND, (WPARAM)MAKEWPARAM(ID, BN_CLICKED), (LPARAM)HWND_BUTTON);
我了解过这个,应该用这个来枚举子窗口,也有常试过这个API函数,不过不知道为什么老是弄不起来,
貌似要一个回调的,在MFC里我搞不起来,所以才发了这个求助帖
能理解大大的意思,不过现阶段,还是向按钮发消息先,我有用spy++看到这些消息,不过暂时不能理解内容,
post是下一步折腾的计划,呵呵呵明白,可是我看了MSDN的说明就糊涂了,或者说不知道应该如何开始。
这次找到的ID是肯定正确的,呵呵
FindWindowEx在MSDN的例子看上去摸不到门道在我这个事情上来用,囧