我想得到别人的程序(好像是用VB写的)里的类似vc里的CListCtrl里的鼠标选中的内容.该如何办啊?
用FindWindow的到指针后如何遍历他的各个控件啊?我用GetWindow()GetNextWindow()好像不行啊.有没有其他办法?
thx!!!!

解决方案 »

  1.   

    向其他程序的ListView控件发送LVM_GETITEMTEXT
    http://www.vckbase.com/document/viewdoc/?id=1223
      

  2.   

    试试WindowFromPoint获取窗口句柄,得到它的类名,以后可用类名直接查找hwnd = WindowFromPoint( POINT Point );
      

  3.   

    #define WIN32_LEAN_AND_MEAN
    #include <stdio.h>
    #include <windows.h>
    #include <commctrl.h>
    #include <process.h>
    #include <tchar.h>
    class CExtListCtrl
    {
    public:
           CExtListCtrl(HWND
    hwndSysListView32):m_hwndSysListView32(hwndSysListView32),m_hProcess(N
    ULL)
           {
                   DWORD pid;
                   GetWindowThreadProcessId(hwndSysListView32, &pid);
                   m_hProcess=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_
    VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);
           }
           ~CExtListCtrl()
           {
                   CloseHandle(m_hProcess);
           }
           int GetItemCount()
           {
                   return (int)SendMessage(m_hwndSysListView32, LVM_GETITEMCOUNT, 0,
    0);
           }
           const TCHAR* GetItemText(int row,int subitemindex)
           {
                   HANDLE process = m_hProcess;
                   LVITEM lvi, *_lviExt;
                   char *cExtItemTextBuf;
                   _lviExt=(LVITEM*)VirtualAllocEx(m_hProcess, NULL, sizeof(LVITEM),
    MEM_COMMIT, PAGE_READWRITE);
                   cExtItemTextBuf=(char*)VirtualAllocEx(m_hProcess, NULL, 512,
    MEM_COMMIT, PAGE_READWRITE);
                   lvi.cchTextMax=512;
                   lvi.iSubItem=subitemindex;
                   lvi.pszText=cExtItemTextBuf;
                   WriteProcessMemory(process, _lviExt, &lvi, sizeof(LVITEM), NULL);
                   SendMessage(m_hwndSysListView32, LVM_GETITEMTEXT, (WPARAM)row,
    (LPARAM)cExtItemTextBuf);
                   ReadProcessMemory(m_hProcess, cExtItemTextBuf, item, 512, NULL);
                   VirtualFreeEx(m_hProcess, _lviExt, 0, MEM_RELEASE);
                   VirtualFreeEx(m_hProcess, cExtItemTextBuf, 0, MEM_RELEASE);
                   return item;
           }
    private:
           HWND m_hwndSysListView32;
           HANDLE m_hProcess;
           char item[512];
    };int CExtListCtrl_test(void) {
           HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView");
           HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL);
    CExtListCtrl mylist(listview);
           int count=mylist.GetItemCount();
           int i;       char item[512], subitem[512];       for(i=0; i<count; i++) {
                   strcpy(item,mylist.GetItemText(i,0));
                   strcpy(subitem,mylist.GetItemText(i,1));               printf("%s - %s\n", item, subitem);
           }       return 0;
    }
    int main(void) {
           CExtListCtrl_test();
           system("pause");
           return 0;
           HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView");
           HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL);       int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);
           int i;       LVITEM lvi, *_lvi;
           char item[512], subitem[512];
           char *_item, *_subitem;
           unsigned long pid;
           HANDLE process;       GetWindowThreadProcessId(listview, &pid);
           process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_W
    RITE|PROCESS_QUERY_INFORMATION, FALSE, pid);       _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),
    MEM_COMMIT, PAGE_READWRITE);
           _item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
    PAGE_READWRITE);
           _subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
    PAGE_READWRITE);       lvi.cchTextMax=512;       for(i=0; i<count; i++) {
                   lvi.iSubItem=0;
                   lvi.pszText=_item;
                   WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
                   SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);               lvi.iSubItem=1;
                   lvi.pszText=_subitem;
                   WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
                   SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);               ReadProcessMemory(process, _item, item, 512, NULL);
                   ReadProcessMemory(process, _subitem, subitem, 512, NULL);               printf("%s - %s\n", item, subitem);
           }       VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
           VirtualFreeEx(process, _item, 0, MEM_RELEASE);
           VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);       return 0;
    }
      

  4.   

    怎么样得到listview的指针或者句柄呢?
    怎么样遍历窗口里的各个控件呢?我用GetWindow()GetNextWindow()好像不行,可能是vb里和vc不一样.
      

  5.   

    API函数应该没有影响的,检察一下代码吧
      

  6.   

    得到一个指针后应该如何判断他是不是listview呢?
    在vc下可以这样做:
    pTmp = DYNAMIC_DOWNCAST(CListCtrl, pChild) ; 
    if(NULL != pTmp)
    {
      ........
    }
    但是如果他的程序是vb写的,怎么样判断得到的这个指针是不是listview的呢?
      

  7.   

    要使用FindWindow好像是这个函数。我记得我在VCkbase里看到了一个人写了一个木马。它可以找到当前系统里,打开的QQ登录的对话框,找到这个对话框的一个密码输入框,然后记录下这个输入框里输入的内容。
      

  8.   

    最好通过WriteProcessMemory,ReadProcessMemory来读写别的进程
      

  9.   

    FindWindow()
    FromWindowPoint()
    GetWindowText()