Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Welche unit wird benötigt? (https://www.delphipraxis.net/105443-welche-unit-wird-benoetigt.html)

ghost007 22. Dez 2007 17:06

Re: Welche unit wird benötigt?
 
Zitat:

Zitat von bitsetter
Versuche es mal so:
Delphi-Quellcode:
const
  BtnIndex= 2;
var
  TB: commctrl.TBBUTTONINFO;
begin
  ZeroMemory(@TB, SizeOf(TB));
  TB.cbSize := sizeof(TB);
  TB.dwMask := commctrl.TBIF_COMMAND;
  SendMessage(..., TB_GETBUTTONINFO, BtnIndex, Cardinal(@TB));
  SendMessage(..., TB_PRESSBUTTON, TB.idCommand, MAKELONG (1, 0));

Hi,
wenn ich das so ausführe um es zu testen, natürlich ersetze ich die '...' du das handle.
Dann bekomm ich bei der anwendung, die toolbar hat eine Fehlermeldung auf der ich auf "fehlerbericht senden" oder "nicht senden" klicken kann und die anwendung wird beendet.

MfG - Ghost007

bitsetter 22. Dez 2007 18:01

Re: Welche unit wird benötigt?
 
Befindet sich die Toolbar denn überhaupt in deiner eigenen Anwendung?

ghost007 22. Dez 2007 18:14

Re: Welche unit wird benötigt?
 
Zitat:

Zitat von bitsetter
Befindet sich die Toolbar denn überhaupt in deiner eigenen Anwendung?

Hi,
sorry irgendwie hatte ich das vorausgesetzt ... die toolbar ist in ner fremdanwendung ... hab mich schon gefragt wie das bei dir so einfach gehen soll ^^ ohne Alloc, etc.

MfG - Ghost007

bitsetter 22. Dez 2007 18:22

Re: Welche unit wird benötigt?
 
Dann weißt du ja selber warum die Fehlermeldung kommt.

Apollonius 22. Dez 2007 18:26

Re: Welche unit wird benötigt?
 
In einer Fremdanwendung ist das nur unwesentlich komplizierter:
Delphi-Quellcode:
var TB: Commctrl.TBBUTTONINFO; p: Commctrl.PTBBUTTONINFO;
begin
  p := VirtualAllocEx(ProcessHandle, nil, SizeOf(TB), MEM_COMMIT, PAGE_READWRITE);
  TB.cbSize := SizeOf(TB);
  TB.dwMask := CommCtrl.TBIF_COMMAND;
  WriteProcessMemory(ProcessHandle, p, @TB, SizeOf(TB.cbSize) + SizeOf(TB.dwMask), nil);
  SendMessage(..., TB_GETBUTTONINFO, BtnIndex, Cardinal(p));
  ReadProcessMemory(ProcessHandle, p, @TB, SizeOf(TB), nil);
  SendMessage(..., TB_PRESSBUTTON, TB.idCommand, MAKELONG (1, 0));
  VirtualFreeEx(ProcessHandle, p, 0, MEM_RELEASE);
end;
Das Prozess-Handle erfährst du mithilfe von GetWindowThreadProcessId.

ghost007 22. Dez 2007 23:29

Re: Welche unit wird benötigt?
 
Hi,
hab das ma einfach zum testen reinkopiert.

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
 var
  TB: Commctrl.TBBUTTONINFO; p: Commctrl.PTBBUTTONINFO;
  ProcessHandle: THandle;
begin
  ProcessHandle:=GetWindowThreadProcessID(wnd,nil);
  p := VirtualAllocEx(ProcessHandle, nil, SizeOf(TB), MEM_COMMIT, PAGE_READWRITE);
  TB.cbSize := SizeOf(TB);
  TB.dwMask := CommCtrl.TBIF_COMMAND;
  WriteProcessMemory(ProcessHandle, p, @TB, SizeOf(TB.cbSize) + SizeOf(TB.dwMask), nil);//HIER ERROR
  SendMessage(wnd, TB_GETBUTTONINFO, BtnIndex, Cardinal(p));
  ReadProcessMemory(ProcessHandle, p, @TB, SizeOf(TB), nil);
  SendMessage(wnd, TB_PRESSBUTTON, TB.idCommand, MAKELONG (1, 0));
  VirtualFreeEx(ProcessHandle, p, 0, MEM_RELEASE);
end;
An der gekennzeichneten stelle bekomm ich einen error: "Types of actual and formal var parameters must be identical"

MfG - Ghost007

bitsetter 22. Dez 2007 23:54

Re: Welche unit wird benötigt?
 
Delphi-Quellcode:
var
  BytesW: cardinal;
begin
  WriteProcessMemory(ProcessHandle, p, @TB, SizeOf(TB.cbSize) + SizeOf(TB.dwMask), BytesW);

ghost007 23. Dez 2007 00:00

Re: Welche unit wird benötigt?
 
Hi,
haut mir immer noch ne fehlermeldung raus bei dem fremden programm und beendet es.

MfG - Ghost007

bitsetter 23. Dez 2007 08:24

Re: Welche unit wird benötigt?
 
Hallo,

bei mir funktioniert es jetzt:
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  TB: Commctrl.TBBUTTONINFO; p: Commctrl.PTBBUTTONINFO;
  ProcessHandle, wnd: THandle;
  BytesW, BytesR, ProcId: cardinal;
const
  BtnIndex= 2;
begin
  wnd:= ...;
  GetWindowThreadProcessId(wnd, @ProcId);
  ProcessHandle := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcId);
  try
    p := VirtualAllocEx(ProcessHandle, nil, SizeOf(TB), MEM_COMMIT, PAGE_READWRITE);
    if Assigned(p) then
    begin
      TB.cbSize := SizeOf(TB);
      TB.dwMask := CommCtrl.TBIF_COMMAND;
      if WriteProcessMemory(ProcessHandle, p, @TB, SizeOf(TB.cbSize) + SizeOf(TB.dwMask), BytesW) and
       (BytesW= SizeOf(TB.cbSize) + SizeOf(TB.dwMask)) then
        if SendMessage(wnd, TB_GETBUTTONINFO, BtnIndex, Cardinal(p))<> 0 then
          if ReadProcessMemory(ProcessHandle, p, @TB, SizeOf(TB), BytesR) and (BytesR= SizeOf(TB)) then
            SendMessage(wnd, TB_PRESSBUTTON, TB.idCommand, MAKELONG (1, 0));
      VirtualFreeEx(ProcessHandle, p, 0, MEM_RELEASE);
    end;
  finally
    CloseHandle(ProcessHandle);
  end;
end;

ghost007 23. Dez 2007 11:12

Re: Welche unit wird benötigt?
 
Hmmm,
jetzt bekomm ich zwar keinen error mehr, jedoch drückt er den button aber auch nicht :(

MfG - ghost007


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz