Как получить данные из не нулевой панели статусбара другой программы. Дескриптор статусбара дает возможность получить только данные Panels[0]?
Здравствуйте, SchweinDeBurg, Вы писали:
L>>Как получить данные из не нулевой панели статусбара другой программы. Дескриптор статусбара дает возможность получить только данные Panels[0]?
SDB>Послать ему SB_GETTEXT.
Работает, если посылаю статусбару своей проги, если чужой — не проходит.

Если шлю WM_GETTEXT, то получаю данные только с Panels[0].
Здравствуйте, leon777, Вы писали:
L>Работает, если посылаю статусбару своей проги, если чужой — не проходит.
L>Если шлю WM_GETTEXT, то получаю данные только с Panels[0].
Ну, обмен сообщениями с "чужими" программами тут уже не раз обсуждался.
Здравствуйте, leon777, Вы писали:
L>Работает, если посылаю статусбару своей проги, если чужой — не проходит.
L>Если шлю WM_GETTEXT, то получаю данные только с Panels[0].
Могу предложить один экзотический способ:
// Получаем PID "чужого" процесса по хэндлу окна
if GetWindowThreadProcessID(AHandle, LProcessID) = 0 then
Exit;
LProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, false, LProcessID);
if LProcessHandle = 0 then
Exit;
try
// Выделяем память в "чужом" процессе
P := VirtualAllocEx(LProcessHandle, nil, SizeOf(S) + 1, MEM_COMMIT, PAGE_READWRITE);
if not Assigned(P) then
Exit;
try
// Посылаем SB_GETTEXT. "Приемник" текста находится в чужом процессе
n := SendMessage(AHandle, SB_GETTEXT, 1, Integer(P));
if n <> 0 then
begin
// Читаем текст из удаленного "приемника" в локальный
if not ReadProcessMemory(LProcessHandle, P, @S[0], SizeOf(S), LRead) then
ShowMessage(Format('read error: %d', [GetLastError]));
// Выводим его на экран (или что там с ним сделать надо)
Label1.Caption := s;
end;
finally
VirtualFreeEx(LProcessHandle, P, SizeOf(S) + 1, MEM_RELEASE);
end;
finally
CloseHandle(LProcessHandle);
end;