vc的程序,获得了一个delphi程序的状态栏句柄后,如何提取其中的数据呢
我写的是CStatusBarCtrl *wndStatusBar = (CStatusBarCtrl*)(CWnd::FromHandle(ghwndStatusBar));//ghwndStatusbar是获得的状态栏指针,类型是CWnd。
如果获得的是vc里面的状态栏,经过这个转换过后,可以通过wndStatusBar->GetText(strInfo,0,NULL);来获取相应的分栏的字符串,可是如果获得的是delphi程序的状态栏的句柄的话,在wndStatusBar->GetText(strInfo,0,NULL);的时候就会报错。请问有什么方法可以在vc中提取获得的delphi程序的状态栏的分栏的字符串?多谢。

解决方案 »

  1.   

    用spy++自己看
    spy++能看到什么你就能看到什么
    CStatusBarCtrl只不过封装了Windows的msctls_statusbar32控件而已。你看看delphi程序里面的那个是不是msctls_statusbar32控件
      

  2.   

    跨进程的读取,你这样肯定是不行的。首先通过向目标窗口发送SB_GETPARTS消息可以得知状态栏分几列。然后用GetWindowThreadProcessId,通过状态栏窗口的句柄得到该窗口所属进程的PID,然后用OpenProcess打开目标进程,用VirtualAllocEx开辟一个空间,通过SB_GETTEXT消息读取状态栏文本,再利用ReadProcessMemory将文本读本进程并显示。
      

  3.   

    DWORD dwProcessID;
    HANDLE hProcess;
    LPVOID lpCommon;
    int nAllocSize = 255;
    int nPnlLen;
    char szBuf[255];
    DWORD dwBytesRead;// StatusBar的项目数(列数)
    int nPnlCount = SendMessage(hStatusBar, SB_GETPARTS, 0, 0);// hStatusBar是状态栏窗口句柄
    GetWindowThreadProcessId(hStatusBar, &dwProcessID);
    //
    hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
            PROCESS_VM_WRITE, false, dwProcessID);
    lpCommon = VirtualAllocEx(hProcess, NULL, nAllocSize,
            MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    // 循环读取每一个StatusBar项目
    for(int i=0; i<nPnlCount; i++)
    {
        SendMessage(hStatusBar, SB_GETTEXT, i, LPARAM(lpCommon));
        ReadProcessMemory(hProcess, lpCommon, szBuf, 255, &dwBytesRead);
        // 文本内容在szBuf中
        // 再这里作处理,可以将szBuf保存到一个列表中,自己看着办    
    }
    VirtualFreeEx(hProcess, lpCommon, 0, MEM_RELEASE);
    CloseHandle(hProcess);