想用自己写的软件调用商业软件,有这样一个弹出的控制面板(如图),其窗体句柄用FindWindow找到了
面板上有一列表框(红圈处),Spy++确认了其是ListBox类,句柄用FindWindowEX找到了
列表框的默认选项不是我需要的,于是我就用PostMessage向其发送了LBN_SELCHANGE消息。这看起来像成功了,“选中”的蓝色阴影的确移到了我要的条目上
但是,软件并没有接受我的操作。当进行后续步骤,比如向下方的“Set”按钮发送WM_LBUTTONDOWN时,选项立刻就跳回了默认位置,这就得不到正确的操作。而用鼠标进行手工控制的时候,是不会发生这种问题的又,经过几位大哥的指点,明确了以下情况:
1.句柄肯定没问题,因为发送消息有反应(选中条目改变)
2.发送LB_SETCURSEL也不行,仍然是只能改变阴影条目
3.给“Set”按钮的父窗口发送BN_CLICKED也不成功,甚至用LB_SETCURSEL改变条目之后手工单击都不成功
面板上有一列表框(红圈处),Spy++确认了其是ListBox类,句柄用FindWindowEX找到了
列表框的默认选项不是我需要的,于是我就用PostMessage向其发送了LBN_SELCHANGE消息。这看起来像成功了,“选中”的蓝色阴影的确移到了我要的条目上
但是,软件并没有接受我的操作。当进行后续步骤,比如向下方的“Set”按钮发送WM_LBUTTONDOWN时,选项立刻就跳回了默认位置,这就得不到正确的操作。而用鼠标进行手工控制的时候,是不会发生这种问题的又,经过几位大哥的指点,明确了以下情况:
1.句柄肯定没问题,因为发送消息有反应(选中条目改变)
2.发送LB_SETCURSEL也不行,仍然是只能改变阴影条目
3.给“Set”按钮的父窗口发送BN_CLICKED也不成功,甚至用LB_SETCURSEL改变条目之后手工单击都不成功
解决方案 »
- 请教菜单问题
- 微软CListCtrl的败笔
- 如何在installshield中注册模块
- 怎样判断当前计算机时间是在每天的17:30分之后(不比较日期)?
- 传送和接收大量数据,是使用进程好,还是线程好呢?为什么?
- winpcap fliter的问题,用过的帮忙看看,100分:)
- 请问在VFW中怎么设置预览窗口大小
- (应该是难的东西)没有定义CLSID_,IID_等形式,怎样使用一个基于IDispatch的COM组件??
- 双套接字问题-socket高手请进
- 我需要帮助,请问用什么函数使窗口的文本框的内容动态的更新?
- 设置两个bottom但是ClassWizard的Object IDs里面没有显示。。
- CRichEdit 的redo函数在vc6.0中是不是没有啊?
1。用鼠标选中inlet,调用LB_GETCURSEL此时返回的索引多少?
2。先用鼠标选中wall,再调用LB_SETCURSEL消息设置到inlet上,此时调用LB_GETCURSEL此时返回的索引多少?
谢谢,我直接用spy++监视了手工操纵的全部消息,还没读懂完,不过反倒没有LB_SETCURSEL
而是一大堆WM_SETCURSOR,WM_NCHITTEST,WM_CAPTURECHANGED,LB_SETHORIZONTALEXTENT之类...我慢慢尝试了,明天再报告
谢谢,我直接用spy++监视了手工操纵的全部消息,还没读懂完,不过反倒没有LB_SETCURSEL
而是一大堆WM_SETCURSOR,WM_NCHITTEST,WM_CAPTURECHANGED,LB_SETHORIZONTALEXTENT之类,记有二三十条...我慢慢尝试了,明天再报告
谢谢,我直接用spy++监视了手工操纵的全部消息,还没读懂完,不过反倒没有LB_SETCURSEL
而是一大堆WM_SETCURSOR,WM_NCHITTEST,WM_CAPTURECHANGED,LB_SETHORIZONTALEXTENT之类,记有二三十条...我慢慢尝试了,明天再报告
SendMessage(hListBox, LB_SETCURSEL, index, 0);
SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_LIST, LBN_SELCHANGE), (LPARAM)hListBox);
这样的话应该可以吧!如果还不行那也没办法了。
恭喜楼主成功了
HWND hWnd = ::FindWindow(NULL, _T("AA"));
if(NULL != hWnd)
{
HWND hListBox = ::FindWindowEx(hWnd, NULL, _T("ListBox"), NULL);
if(NULL != hListBox)
{
::SendMessage(hListBox, LB_SETCURSEL, 0, 0);
}
HWND hButton = ::FindWindowEx(hWnd, NULL, _T("Button"), _T("Set"));
if(NULL != hButton)
{
UINT nID = ::GetDlgCtrlID(hButton);
::PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(nID, BN_CLICKED), (LPARAM)hButton);
}
}
2、对于这种问题,生成一个全局钩子HOOK,应该会很简单吧