想用自己写的软件调用商业软件,有这样一个弹出的控制面板(如图),其窗体句柄用FindWindow找到了
面板上有一列表框(红圈处),Spy++确认了其是ListBox类,句柄用FindWindowEX找到了
列表框的默认选项不是我需要的,于是我就用PostMessage向其发送了LBN_SELCHANGE消息。这看起来像成功了,“选中”的蓝色阴影的确移到了我要的条目上
但是,软件并没有接受我的操作。当进行后续步骤,比如向下方的“Set”按钮发送WM_LBUTTONDOWN时,选项立刻就跳回了默认位置,这就得不到正确的操作。而用鼠标进行手工控制的时候,是不会发生这种问题的又,经过几位大哥的指点,明确了以下情况:
1.句柄肯定没问题,因为发送消息有反应(选中条目改变)
2.发送LB_SETCURSEL也不行,仍然是只能改变阴影条目
3.给“Set”按钮的父窗口发送BN_CLICKED也不成功,甚至用LB_SETCURSEL改变条目之后手工单击都不成功

解决方案 »

  1.   

    先确认以下情况,用鼠标选中的项目和用消息LB_SETCURSEL选中返回的(用消息LB_GETCURSEL)选中项目的索引一致吗?
    1。用鼠标选中inlet,调用LB_GETCURSEL此时返回的索引多少?
    2。先用鼠标选中wall,再调用LB_SETCURSEL消息设置到inlet上,此时调用LB_GETCURSEL此时返回的索引多少?
      

  2.   


    谢谢,我直接用spy++监视了手工操纵的全部消息,还没读懂完,不过反倒没有LB_SETCURSEL
    而是一大堆WM_SETCURSOR,WM_NCHITTEST,WM_CAPTURECHANGED,LB_SETHORIZONTALEXTENT之类...我慢慢尝试了,明天再报告
      

  3.   


    谢谢,我直接用spy++监视了手工操纵的全部消息,还没读懂完,不过反倒没有LB_SETCURSEL
    而是一大堆WM_SETCURSOR,WM_NCHITTEST,WM_CAPTURECHANGED,LB_SETHORIZONTALEXTENT之类,记有二三十条...我慢慢尝试了,明天再报告
      

  4.   


    谢谢,我直接用spy++监视了手工操纵的全部消息,还没读懂完,不过反倒没有LB_SETCURSEL
    而是一大堆WM_SETCURSOR,WM_NCHITTEST,WM_CAPTURECHANGED,LB_SETHORIZONTALEXTENT之类,记有二三十条...我慢慢尝试了,明天再报告
      

  5.   

    hwndDlg 为对话框句柄,IDC_LIST 为 ListBox 的 ID,hListBox 为句柄:
    SendMessage(hListBox, LB_SETCURSEL, index, 0);
    SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_LIST, LBN_SELCHANGE), (LPARAM)hListBox);
    这样的话应该可以吧!如果还不行那也没办法了。
      

  6.   

    csdn的问题,最近一发就是3篇帖子
    恭喜楼主成功了
      

  7.   

    你用程序操纵FLUENT的目的何在?
      

  8.   


    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);
    }
    }
      

  9.   

    发消息来控制其他程序是最基础的做法了。你这个需求更像是外挂,最佳做法是注入dll到目标进程里,直接call目标进程的函数,也可以从注入dll进程里发消息,更稳定一些,因为这消息会被视为自己进程发送的消息。
      

  10.   

    1.LB_SETCURSEL这类消息应该是只对当前线程的窗口有效吧!
    2、对于这种问题,生成一个全局钩子HOOK,应该会很简单吧
      

  11.   

    光发送LB_SETCURSEL不成,看来选中项改了,一发送BN_CLICKED就跳回去了