第三方程序中的listbox如何選中

132343454656 2014-03-03 05:35:11
我有一個第三方的RR.exe,打開后有個listbox,其中有DDC/USB/RS232等連接選項,還有一份“Connection”按鈕,我要把這個軟件嵌入到自己的程序中,用WinExec打開RR.exe正常,用Findwindow找到窗口句柄及listbox和Connection句柄,用Sendmessage(HWNDlistbox,LB_SETCURSEL,1,0)到USB光標也能正常顯示到USB選項,再Sendmessage(HWNDConnection,BM_CLICK,0,0),但是無法連接,
用手動連接是可以的,或者在Sendmessage(HWNDlistbox,LB_SETCURSEL,1,0)再鼠標手動點擊USB再連接也正常,不知道listbox使用句柄到底如何才能選中USB?
...全文
167 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2014-03-04
  • 打赏
  • 举报
回复
这个rr.exe是干啥用的,方便的话压缩发我信箱。
132343454656 2014-03-04
  • 打赏
  • 举报
回复
我自己寫了個帶listbox的程式,listbox分別是0,1,2,3,listbox onclick事件為選中哪個item,就showmessage item的值,然後我用上貼的方法用另外的程序findwindow 窗體句柄,listbox句柄, LB_SETCURSEL ,LB_SETSEL,然後程式就能正常彈出showmessage的item值。 但客戶給的RR。exe就不行,鬱悶了。
我不懂电脑 2014-03-04
  • 打赏
  • 举报
回复
建议你用winsight找到句柄发送消息试试
132343454656 2014-03-04
  • 打赏
  • 举报
回复
if(WinExec("D:\\RLS_2_2_52_0\\LoggingTool.exe",SW_SHOW)<31)
{
// ShowMessage("LOG TOOL OPEN SUCCESS");
}
HWND MainWin;
Sleep(1000);
MainWin=FindWindow(0,"LoggingTool [Build: Dec 23 2013 17:53:54]");

/* if(MainWin !=NULL)
{
ShowMessage("logging tool find");
ShowMessage(IntToStr(MainWin));
}
*/
HWND m_hListBox=FindWindowExA(MainWin,NULL,"ListBox",NULL);

m_hListBox=FindWindowExA(MainWin,m_hListBox,"ListBox",NULL);
/* if(m_hListBox !=NULL)
{
ShowMessage("m_hListBox find");
ShowMessage(IntToStr(m_hListBox));
} */
// int count= ::SendMessage(m_hListBox,LB_GETCURSEL,0,0);
// ShowMessage(count);
::SendMessage(m_hListBox,LB_SETCURSEL,1,0);
::SendMessage(m_hListBox,BM_CLICK,1,0);

::SendMessage(m_hListBox,LB_SETSEL,true,1);
::SendMessage(MainWin ,LBN_SELCHANGE,1,0);
UpdateWindow;

::SendMessage(m_hListBox,WM_COMMAND,0x90000,(LPARAM)m_hListBox);
::SendMessage(m_hListBox,WM_COMMAND,0x10000,(LPARAM)m_hListBox);
::SendMessage(MainWin,WM_COMMAND,0x90000,(LPARAM)m_hListBox);
::SendMessage(MainWin,WM_COMMAND,0x10000,(LPARAM)m_hListBox);
Sleep(1000);
HWND GetConnection=FindWindowExA(MainWin,NULL,"Button","GetConnection");
::SendMessage( GetConnection,BM_CLICK, 0, 0);
//Sleep(10000);

// HWND LumEDIT=FindWindowExA(MainWin,NULL,"Edit",NULL);
/* if(LumEDIT !=NULL)
{
ShowMessage("LumEDIT find");
ShowMessage(IntToStr(LumEDIT));
} */
//AnsiString ee="200";
// ::SendMessage( LumEDIT,WM_SETTEXT,20,(LPARAM)ee.c_str());



// HWND SetBtn=FindWindowExA(MainWin,NULL,"Button","Set");
/* if(SetBtn !=NULL)
{
ShowMessage("SetBtn find");
ShowMessage(IntToStr(SetBtn));
} */


ccrun.com 2014-03-04
  • 打赏
  • 举报
回复
有这么神奇?把你的代码发出来瞅瞅。你确定ListBox的句柄成功获取到了?
132343454656 2014-03-04
  • 打赏
  • 举报
回复
還是不行,不知道到底什麽原因?
ccrun.com 2014-03-04
  • 打赏
  • 举报
回复
直接编译肯定不行撒,需要修改一下:
SendMessage(HWNDlistbox, WM_COMMAND, 0x90000, (LPARAM)HWNDlistbox);
SendMessage(HWNDlistbox, WM_COMMAND, 0x10000, (LPARAM)HWNDlistbox);
132343454656 2014-03-04
  • 打赏
  • 举报
回复
LB_SETSEL和LB_SETCURSEL都用了,也UpdateWindow, 用LB_GetCURSEL發現也從0變為了2,但還是不行,應該是消息沒返回到主窗口去, 有文章說要用 win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x90000, CB_handle) 17. win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x10000, CB_handle) 但我編譯不過去
ccrun.com 2014-03-04
  • 打赏
  • 举报
回复
刚才搞错鸟,应该LB_SETCURSEL消息才对。
SendMessage(ListBox1->Handle, LB_SETCURSEL, 2, 0); // 选中第三行Item
132343454656 2014-03-04
  • 打赏
  • 举报
回复
試了,不行,
ccrun.com 2014-03-04
  • 打赏
  • 举报
回复
用 LB_SETSEL 试试:
Sendmessage(HWNDlistbox, LB_SETSEL, TRUE, 2); // 选中ListBox中第3行
132343454656 2014-03-04
  • 打赏
  • 举报
回复
妖哥,您的信箱方便給一下嗎?謝謝!
sololie 2014-03-03
  • 打赏
  • 举报
回复
啥RR.exe,方便的话传上来瞅瞅试试

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧