Hallo,
es geht darum, eine Toolbar (die Schnellstartleiste = QuickLaunch) auszulesen, bzw. die Caption-Texte von den Buttons darauf. Bei einem 32bit-Win7 klappte das, beim 64bit-Win7 meines neuen Laptops jetzt aber leider nicht mehr.
Das exakt gleiche Problem hatte ich auch schon beim des Auslesens eines ListView-Controls. Das allerdings konnte ich lösen, mittels eines Tipps (von teebee) aus dem Forum hier (
http://www.delphipraxis.net/129414-i...vista-x64.html). Die Lösung hier lag in einem Umbau einer LVItem-Struktur von einer 32Bit-Struktur in eine 64Bit-Struktur.
Ergo versuchte ich diese Lösung 1:1 auf mein ToolBar-Problem zu übertragen, was jetzt aber leider nicht mehr funktionierte. Nach wie vor bekomme ich als Text für die Button-Captions immer wieder nur einen leeren String zurück.
Sieht event. jemand woran das liegen könnte?
Und: Ist meine TBBUTTONINFO64-Struktur auch genauso geworden, wie sie ein 64bit-System erwartet?
Delphi-Quellcode:
function TSmallIconForm.GetTBButtonText64Bit(idCommand: Integer): String;
type
TBBUTTONINFO64 = packed record
ewMask: DWORD;
idCommand: Integer;
iImage: Integer;
fsState: Byte;
fsStyle: Byte;
cx: Word;
lParam: DWORD;
// pszText: PAnsiChar;
_align: LongInt; // Zeiger müssen in 64-Bit-Windows an 8-Byte-Alignment beginnen
pszText: Int64; // Zeiger haben in 64-Bit-Windows 8 Byte
cchText: Integer;
end;
PTBButtonInfo64 = ^TBButtonInfo64;
var ItemGlob: PTBButtonInfo64;
InfoStruc: TBButtonInfo64;
Buffer: Array[0..255] of Char;
hProc: THandle;
bw: Cardinal;
begin
Result := '[Error]';
if hSchnellstartleiste <> 0 then
begin
hProc := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,false,PID_TaskBar);
if hProc <> 0 then
begin
ItemGlob := VirtualAllocEx(hProc,nil,SizeOf(InfoStruc)+SizeOf(Buffer),
MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
if ItemGlob <> nil then
try
with InfoStruc do
begin
InfoStruc.cbSize := sizeof(InfoStruc);
InfoStruc.dwMask := TBIF_TEXT;
pszText := Cardinal(ItemGlob)+SizeOf(InfoStruc);
cchText := SizeOf(Buffer);
end;
WriteProcessMemory(hProc,ItemGlob,@InfoStruc,SizeOf(InfoStruc),bw); // parameter zum Data-Transfer: ..., "nach", "von", "länge",...
sendMessage(hSchnellstartleiste,TB_GETBUTTONINFO,idCommand,integer(ItemGlob));
ReadProcessMemory(hProc,Pointer(Cardinal(ItemGlob)+SizeOf(InfoStruc)), // parameter zum Data-Transfer: ..., "von", "nach", "länge",...
@Buffer[0],SizeOf(Buffer),bw);
Result := Buffer;
finally
VirtualFreeEx(hProc,ItemGlob,SizeOf(InfoStruc)+SizeOf(Buffer),MEM_RELEASE);
CloseHandle(hProc);
end;
end;
end;
end;