问题:
我实在想不明白我的问题所以来请教一下您希望能给个明灯。。
其实也就是句柄问题.我的程序上面有一个StatusBar1控件.增加了3个Panels.现在我想再另外写一个软件来实时监控第二个Panels的text。可是我在网上找了很多都没解决掉。也试过用EnumChildWindows(hFrm, @TryGetText, LPARAM(Self))获取父窗口然后列举所有子窗口也没有成功。。
所以想请大哥帮帮忙看看如何才能获取得到,晚上可以再加分
回答:
StatusBar的Panel并没有句柄,StatusBar才有。
获取本进程或其他进程中StatusBar的Panel文本,可以通过向StatusBar发送SB_GETTEXT消息来搞定,不过需要注意的是,如果是获取其他进程中的StatusBar信息,需要注入到目标进程,开辟缓冲,获取Panel文本后再用ReadProcessMemory读回。
正确答案,
明生注:本人水平有限,如哪里有注释不对的请留言提醒一下。谢谢
procedure CrnGetStatusBarItem(hStatusBar: THandle; pList: TStrings);
var
dwProcessID: DWORD;
hProcess: THandle;
lpCommon: Pointer;
nAllocSize: integer;// = 255;
szBuf: array [0..255] of char;
dwBytesRead: DWORD;
nPnlCount: integer;
i: integer;
begin
nAllocSize := 255;
nPnlCount := SendMessage(hStatusBar, SB_GETPARTS, 0, 0); //用 sb_getparts来取得sta控件(状态栏)的子数目
pList.Add('StatusBar的项目数: ' + IntToStr(nPnlCount));
GetWindowThreadProcessId(hStatusBar, @dwProcessID); //然后注入到他的进程,因为不注入是获取不到的
hProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ, false, dwProcessID);
//上面这个函数是用来打开一个已知进程对像,并且返回他的句柄(PID)。在开刷广告时就用过这个函数很不错
//此打开具备读取,写入,查询的权限
lpCommon := VirtualAllocEx(hProcess, nil, nAllocSize,
MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
//上面,注入后需要用到 VirtualAllocEx 函数来获取相对应大小的缓冲区
for i := 0 to nPnlCount - 1 do
begin
SendMessage(hStatusBar, SB_GETTEXT, i, LPARAM(lpCommon));
ReadProcessMemory(hProcess, lpCommon, @szBuf, 255, dwBytesRead);
//最后用ReadProcessMemory读出指定的内存地址数据
pList.Add(szBuf);
end;
VirtualFreeEx(hProcess, lpCommon, 0, MEM_RELEASE);
CloseHandle(hProcess);
end;
原创文章如转载,请注明:转载自心动吧DELPHI网络书 [ http://www.abcxd.com/delphi/ ]
本文链接地址:http://www.abcxd.com/delphi/abcxddelphi/delphiMemo/ReadProcessMemory-OpenProcess-VirtualAllocEx.html