dwj0 发表于 2011-11-28 11:21:23

请问VC如何控制另一个软件中CListCtrl中CheckBox的选中和不选

一个软件中的CListCtrl有CheckBox属性,
请问有什么方法可以在另一个软件中设置这个的CheckBox状态
以下是我的代码,运行以后CListCtrl中前面的复选框都找不到了


        CWnd *pWnd=FindWindow(NULL,"Login");
        if (pWnd==NULL) return;
        CListCtrl *pList=(CListCtrl*)pWnd->GetDlgItem(0x3e8);
        int Len=pList->GetItemCount();
        for (int i=0;i<Len;i++)
        {
                BOOL Flag=pList->GetCheck(i);
                pList->SetCheck(i,TRUE);
                Flag=pList->GetCheck(i);
        }
        或者
        HWND hMainWnd=::FindWindow(NULL,"Login");
        if (hMainWnd==NULL) return;
        HWND hListWnd=::GetDlgItem(hMainWnd,0x3e8);
        int Len=::SendMessage(hListWnd,LVM_GETITEMCOUNT,0,0);
        //后面该怎么做
        ...

huayuliang 发表于 2011-11-28 11:35:53

hook

dwj0 发表于 2011-12-4 21:11:20

怎么没人知道呢

yujie 发表于 2011-12-4 22:41:24

windows 不支持类指针跨进程引用吧。你这样pList是一个无效不安全的类。在同一个进程中才可以这样引用。不同进程时只能用SendMessage、PostMessage 等消息函数来执行复选框取消与选中的操作。

yujie 发表于 2011-12-4 22:52:22

#define ListView_SetItemState(hwndLV, i, data, mask) \
{ LV_ITEM _ms_lvi;\
_ms_lvi.stateMask = mask;\
_ms_lvi.state = data;\
SNDMSG((hwndLV), LVM_SETITEMSTATE, (WPARAM)i, (LPARAM)(LV_ITEM FAR *)&_ms_lvi);\
}

#define INDEXTOSTATEIMAGEMASK(i) ((i) << 12)
#define ListView_SetCheckState(hwndLV, i, fCheck) \
   ListView_SetItemState(hwndLV, i, INDEXTOSTATEIMAGEMASK((fCheck)?2:1), LVIS_STATEIMAGEMASK)

//设置复选框
ListView_SetCheckState(hListWnd, 列表索引, true);

rlogin 发表于 2011-12-5 00:35:25

用FindWindows找到这个窗体,再进行下一步操作

dwj0 发表于 2011-12-6 12:33:56

4楼的不行啊,跟我的代码运行结果一样,运行后连复选框都找不到了
看下面图片的上面一个
http://cache.amobbs.com/bbs_upload782111/files_48/ourdev_702060H23JRH.gif
(原文件名:Snap1.gif)

dwj0 发表于 2011-12-6 16:07:39

感谢4楼的提示,虽然4楼的代码不能直接用,但却给了我一种方法,使我实现了这一功能,再次谢谢
页: [1]
查看完整版本: 请问VC如何控制另一个软件中CListCtrl中CheckBox的选中和不选