Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > pointer to integer?


Автор: mntek 3.8.2004, 14:01
Есть проблема с SendMessage:
В SDK по TB_GETBUTTONTEXT сказано -
wParam = (WPARAM) idButton;
lParam = (LPARAM) (LPSTR) lpszText;

Как переделать pointer на текст в integer?
и еще pointer в string, plz smile.gif)

Автор: Serggggg 3.8.2004, 14:28
Попробуй извлечь следующим образом

Integer(Pointer) или String(Pointer)

Автор: mntek 3.8.2004, 14:59
тогда возникает другая проблема:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
 ShellTrayWnd, ReBarWindow32,
 MSTaskSwWClass, ToolbarWindow32: HWND;
 str: string;
 int: integer;
begin
 ShellTrayWnd := findwindow('ShellTrayWnd', nil);
 ReBarWindow32 := findwindowex(ShellTrayWnd, 0, 'ReBarWindow32', nil);
 MSTaskSwWClass := findwindowex(ReBarWindow32, 0, 'MSTaskSwWClass', nil);
 ToolbarWindow32 := findwindowex(MSTaskSwWClass, 0, 'ToolbarWindow32', nil);
 int := inttostr(SendMessage(ToolbarWindow32, TB_GETBUTTONTEXT, 1, integer(@str)));
 if (int = -1) then exit else
   label2.Caption := int;
 label1.Caption:= str
end;

по идее должен возвращаться текст кнопки, но ничего не проиходитsad.gif

Автор: RA 3.8.2004, 16:01
Попробуй вот так.


Код

procedure TForm1.Button1Click(Sender: TObject);

var
ShellTrayWnd, ReBarWindow32,
MSTaskSwWClass, ToolbarWindow32: HWND;
str: array [1..100] of char;
int: String;
begin
ShellTrayWnd := findwindow('ShellTrayWnd', nil);
ReBarWindow32 := findwindowex(ShellTrayWnd, 0, 'ReBarWindow32', nil);
MSTaskSwWClass := findwindowex(ReBarWindow32, 0, 'MSTaskSwWClass', nil);
ToolbarWindow32 := findwindowex(MSTaskSwWClass, 0, 'ToolbarWindow32', nil);
int := IntToStr (SendMessage(ToolbarWindow32, TB_GETBUTTONTEXT, 1, integer(@str) ) );
if (strToint(int) = -1) then exit else
  label2.Caption := int;
  label1.Caption:= str
end;

Добавлено @ 16:04
Проверить свою точку зрения несмог тк не понимаю чему равен TB_GETBUTTONTEXT и вообще из какого Unita это взято ?

Автор: Girder 3.8.2004, 16:09
Код

uses ... CommCtrl;
procedure TForm1.Button1Click(Sender: TObject);
var
ShellTrayWnd, ReBarWindow32,
MSTaskSwWClass, ToolbarWindow32: HWND;
s:string;
i,idB: integer;
begin
...
idB:=1; //Номер кнопки
i:=SendMessage(ToolbarWindow32, TB_GETBUTTONTEXT, idB, 0); //узнаем длину надписи
s:='';
if (i=-1) then ShowMessage('ShowCaptions=False!!!') else
 begin
  SetLength(s,i);
  i:=SendMessage(ToToolbarWindow32, TB_GETBUTTONTEXT, idB,DWord(PChar(s)));
  label2.Caption := IntToStr(i);
  label1.Caption:=s;
 end;
end;


Удачи.

Автор: mntek 3.8.2004, 16:46
тоже не выход -у мну рестартится Explorer после нажатия на кнопкуsad.gif

Автор: Girder 3.8.2004, 18:40
Блин, не заметил тыж у чужого процесса запрашиваеш.

Тогда вот так:
Код
uses ... CommCtrl;
procedure TForm1.Button1Click(Sender: TObject);
var ShellTrayWnd,ReBarWindow32,MSTaskSwWClass,ToolbarWindow32: HWND;
   s:string;
   i,iL:integer;
   j:Cardinal;
   id_tb32,h_Pr:Cardinal;
   sP:Pointer;
   f:Boolean;
begin
memo1.Clear;  
memo2.Clear;  
ShellTrayWnd:=findwindow(PAnsiChar('Shell_TrayWnd'), nil);
if ShellTrayWnd=0 then exit;
ReBarWindow32:=findwindowex(ShellTrayWnd,0,PAnsiChar('ReBarWindow32'), nil);
if ReBarWindow32=0 then exit;
MSTaskSwWClass:=findwindowex(ReBarWindow32,0,PAnsiChar('MSTaskSwWClass'), nil);
if MSTaskSwWClass=0 then exit;
ToolbarWindow32:=findwindowex(MSTaskSwWClass,0,PAnsiChar('ToolbarWindow32'), nil);
if ToolbarWindow32=0 then exit;
i:=SendMessage(ToolbarWindow32,TB_BUTTONCOUNT,0,0);
if i>0 then
 repeat
  dec(i);
  f:=Boolean(SendMessage(ToolbarWindow32,TB_ISBUTTONHIDDEN,i,0));
  GetWindowThreadProcessId(ToolbarWindow32,@id_tb32);
  h_Pr:=OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ, false,id_tb32);
  if h_Pr<>0 then
   begin
    iL:=SendMessage(ToolbarWindow32, TB_GETBUTTONTEXT,i,0); //узнаем длину надписи
    if (iL=-1) then ShowMessage('ShowCaptions=False!!!') else //на всяк пожарный
     begin
      SetLength(s,iL*2);
      sP:=VirtualAllocEx(h_Pr,nil,Length(s),MEM_RESERVE or MEM_COMMIT,PAGE_READWRITE);
      iL:=SendMessage(ToolbarWindow32,TB_GETBUTTONTEXT,i,integer(sP));
      if ReadProcessMemory(h_Pr,sP,PChar(s),iL,j) then
       if f then memo1.Lines.Add(IntToStr(iL)+': '+copy(s,1,iL)) else
        memo2.Lines.Add(IntToStr(iL)+': '+copy(s,1,iL));
      VirtualFreeEx(h_Pr,sP,0,MEM_RELEASE);
     end;
    CloseHandle(h_Pr);
   end;
 until (i=0);
end;


Удачи.

Автор: mntek 3.8.2004, 22:42
big thanq smile.gif)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)