Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Button finden und betätigen (https://www.delphipraxis.net/2662-button-finden-und-betaetigen.html)

Daniel B 31. Jan 2003 19:31


Button finden und betätigen
 
Hallöchen,

wie finde ich auf einer Registerkarte einen Button und betätige ihn?
Vielen Dank.

Grüsse, Daniel :hi:

Christian Seehase 31. Jan 2003 19:34

Moin Daniel,

meinst Du jetzt auf irgendeinen Button auf einem Tabsheet, oder den mit dem man ein bestimmtes Tabsheet auswählt?
Ausserdem:
In Deinem Programm, oder einem fremden?

Daniel B 31. Jan 2003 19:37

Moin Christian,

Du hast ja auch den Thread gelesen, wo es drum ging den Verlauf zu leeren.
Ich habe jetzt einen Weg gefunden, die IE-Einstellungen zu öffnen und den richtigen Reiter anzuzeigen. Nun muss ich noch irgendwie den Verlauf-Button betätigen. Dazu muss ich ihn erstmal finden. Und dann betätigen, die Abfrage die anschliessend kommt, kann man ja lassen.

Grüsse, Daniel :hi:

Christian Seehase 31. Jan 2003 19:39

Moin Daniel,

um den Button zu finden, gibt es die schönen Funktionen FindWindow/EnumWindow/EnumChildWindow.

Wenn Du dann das Handle den Button hast, kannst Du mit SendMessage eine BM_CLICK Message an diesen Senden.

Wie hast Du den Dialog geöffnet?

Daniel B 31. Jan 2003 19:43

Moin Chritian,
Zitat:

Zitat von Christian Seehase
um den Button zu finden, gibt es die schönen Funktionen FindWindow/EnumWindow/EnumChildWindow.
Wenn Du dann das Handle den Button hast, kannst Du mit SendMessage eine BM_CLICK Message an diesen Senden.

hmm, more help needed! :oops:
Zitat:

Wie hast Du den Dialog geöffnet?
Delphi-Quellcode:
procedure TForm1.Button15Click(Sender: TObject);
begin
  ShellExecute(Handle, nil, 'rundll32.exe',
    'shell32.dll,Control_RunDLL inetcpl.cpl,,0', nil, SW_SHOW);
end;
Die 0 ist der Index des Reiters, also desjenigen der beim ausführen aktiv sein soll.
Da es 7 Reiter gibt, gehts also von 0 bis 6! Irgendwi eLogisch nicht? ;)

Grüsse, Daniel :hi:

Christian Seehase 31. Jan 2003 20:08

Moin Daniel,

daran, dass es sich um eine CPL handelt hatte ich gar nicht gedacht ;-)

Probier's mal damit (bis auf das Ausführen des BM_CLICK ist's getestet)

Delphi-Quellcode:
procedure TfrmMAIN.Button1Click(Sender: TObject);

  function EnumChildProc(const AhWindow : DWORD;const ADummy : PDWORD) : Boolean; stdcall;

  var
    pBuffer : PChar;
    dwSize : DWORD;

  begin
    Result := true;
    dwSize := 255;
    pBuffer := AllocMem(dwSize);
    try
      if GetClassName(AhWindow,pBuffer,dwSize) = 0 then
      begin
        exit;
      end;
      if trim(pBuffer) <> 'Button' then
      begin
        exit;
      end;
    finally
      FreeMem(pBuffer,dwSize);
    end;
    dwSize := SendMessage(AhWindow,WM_GETTEXTLENGTH,0,0)+1;
    if dwSize = 0 then
    begin
      exit;
    end;
    pBuffer := AllocMem(dwSize);
    try
      SendMessage(AhWindow,WM_GETTEXT,dwSize,lparam(pBuffer));
      if trim(pBuffer) = '"&Verlauf" leeren' then
      begin
        SendMessage(AhWindow,BM_CLICK,0,0);
        Result := false;
      end;
    finally
      FreeMem(pBuffer,dwSize);
    end;
  end;

var
  hWindow : DWORD;

begin
  hWindow := FindWindow(nil,'Eigenschaften von Internet');
  if hWindow <> 0 then
  begin
    EnumChildWindows(hWindow,@EnumChildProc,0);
  end;
end;

Piro 24. Nov 2004 02:14

Re: Button finden und betätigen
 
Moin habe mal euren code benutzt aber bei mir funzt nichts. wie ist es denn bei euch?

Vielleicht kann Daniel ja mal sagen, ob er es geschafft hat?

Sven

Sprint 24. Nov 2004 04:23

Re: Button finden und betätigen
 
Hab das mal ein bisschen umgeschrieben. Und "Dateien löschen" genommen, damit du sehen kannst, das es funktioniert.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  FindHWnd: HWND;
begin

  FillChar(SI, SizeOf(TStartupInfo), 0);
  SI.cb := SizeOf(TStartupInfo);
  if CreateProcess(nil, 'RUNDLL32.EXE shell32.dll,Control_RunDLL inetcpl.cpl,,0', nil, nil, False, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, INFINITE);
    FindHWnd := FindWindow(nil, 'Eigenschaften von Internet');
    if IsWindow(FindHWnd) then
    begin
      FindHWnd := FindWindowEx(FindHWnd, 0, '#32770', 'Allgemein');
      if IsWindow(FindHWnd) then
      begin
        FindHWnd := FindWindowEx(FindHWnd, 0, 'Button', '&Dateien löschen...');
        if IsWindow(FindHWnd) then
        begin
          SendMessage(FindHWnd, BM_CLICK, 0, 0);
        end;
      end;
    end;
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end;

end;

Piro 24. Nov 2004 10:27

Re: Button finden und betätigen
 
Danke für deine Antwort. Ich hätte auch mal gerne mehr Durchblick bei solchen Sachen. Was sollte ich mir denn mal ansehen oder durchlesen? Diese ganzen Befehle sind mir ein rätsel.

Danke.

Piro 24. Nov 2004 10:31

Re: Button finden und betätigen
 
habe das gerade mal getestet aber wenn ich das auf verlauf leeren ändere, will es nicht funzen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  FindHWnd: HWND;
begin

  FillChar(SI, SizeOf(TStartupInfo), 0);
  SI.cb := SizeOf(TStartupInfo);
  if CreateProcess(nil, 'RUNDLL32.EXE shell32.dll,Control_RunDLL inetcpl.cpl,,0', nil, nil, False, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, INFINITE);
    FindHWnd := FindWindow(nil, 'Eigenschaften von Internet');
    if IsWindow(FindHWnd) then
    begin
      FindHWnd := FindWindowEx(FindHWnd, 0, '#32770', 'Allgemein');
      if IsWindow(FindHWnd) then
      begin
        FindHWnd := FindWindowEx(FindHWnd, 0, 'Button', '&"Verlauf" leeren');
        if IsWindow(FindHWnd) then
        begin
          SendMessage(FindHWnd, BM_CLICK, 0, 0);
        end;
      end;
    end;
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end;

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 Uhr.
Seite 1 von 2  1 2      

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