Tipy a triky v Delphi, díl 109.

A máme zde opět něco netradičního a ne příliš často používaného. Budeme programově mačkat tlačítka cizích aplikací.
Jistě, rovnou uznávám, že to není zrovna běžný postup, jak komunikovat s cizí aplikací a je to s trochou nadsázky "pirátský" způsob. Nicméně někdy jinou možnost nemáme, takže se může popsaný způsob některému ze čtenářů hodit.

Nejprve lehce a zjednodušeně nastíním celý postup. Vytvoříme funkci, jejímž parametrem bude handle okna cílové aplikace a text příslušného tlačítka. Funkce pak příslušné okno a tlačítko najde a pošle mu zprávu BM_CLICK, čímž dojde k jeho stisknutí.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function EnumChildProc(Wnd: hWnd; SL: TStrings): BOOL; stdcall;
var
  szFull: array[0..MAX_PATH] of Char;
begin
  Result := Wnd <> 0;
  if Result then
  begin
    GetWindowText(Wnd, szFull, SizeOf(szFull));
    if (Pos(SL[0], StrPas(szFull)) > 0) and (SL.IndexOfObject(TObject(Wnd)) < 0)
    then SL.AddObject(StrPas(szFull), TObject(Wnd));
    EnumChildWindows(Wnd, @EnumChildProc, Longint(SL));
  end;
end;

function ClickButton(ParentWindow: Hwnd; const ButtonCaption: string): Boolean;
var
  SL: TStringList;
  H: hWnd;
begin
  SL := TStringList.Create;
  try
    SL.AddObject(ButtonCaption, nil);
    EnumChildWindows(ParentWindow, @EnumChildProc, Longint(SL));
    H := 0;
    case SL.Count of
      1: ShowMessage(`Objekt nenalezen.`);
      2: H := hWnd(SL.Objects[1]);
    else
      ShowMessage(`Text neni jednoznacny.`);
    end;
  finally
    SL.Free;
  end;
  Result := H <> 0;
  if Result then PostMessage(H, BM_CLICK, 0, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClickButton(FindWindow(`TForm1`, `Form1`), `Button1`);
end;

end.

Jak vidíte v ukázce, k získání handle pro hledané okno použijeme funkce FindWindow s patřičnými parametry (tedy třída okna a nadpis okna). Pro otestování příkladu (tak, jak je napsán) si vytvořte novou aplikaci s jedním tlačítkem Button1 a tomuto tlačítku přiřaďte nějakou událost. Například může zobrazit text pomocí ShowMessage. Tuto aplikaci poté spusťte a rovněž náš dnešní příklad. Když pak tlačítkem aktivujeme funkci a vše půjde dobře, bude stisknuto tlačítko u druhé aplikace a zobrazen váš text. Ovšem pozor. Důležité je, aby jste změnili název okna u aplikace s dnešním příkladem. Proč? Protože pokud to neuděláte, bude mít formulář titulek Form1 a bude pochopitelně třídy TForm1. A navíc obsahuje i tlačítko Button1 pro spuštění funkce. Co se stane, pokud nezměníte názvy? Aktivací tlačítka se spustí funkce, která začne přesně podle popsaného postupu hledat cílové okno a cílové tlačítko. Program ovšem najde sám sebe a znovu stiskne tlačítko, čímž se znovu spustí hledání. A stále dokola. Dojde tak vlastně k nekonečnému zacyklení, kdy bude neustále mačkáno tlačítko naší aplikace. Proto nezapomeňte upravit příslušným způsobem název okna.

Diskuze (2) Další článek: NVidia představila GoForce 2150

Témata článku: Software, Windows, Programování, Popsaný způsob, Trik, Díl


Určitě si přečtěte

Nechali jsme dopadnout asteroid Ryugu na Prahu. Místo stověžatého města je pětikilometrový kráter

Nechali jsme dopadnout asteroid Ryugu na Prahu. Místo stověžatého města je pětikilometrový kráter

** Ryugu je blízkozemní planetka, která křižuje dráhu Země ** Její průměr je asi 900 metrů ** Co by se stalo, kdyby Ryugu dopadla na Zemi?

Petr Kubala | 5

Roboruka se 100 let učila otočit kostičku. Skutečné A.I. se možná nikdy nedočkáme

Roboruka se 100 let učila otočit kostičku. Skutečné A.I. se možná nikdy nedočkáme

** Strojové učení v posledních deseti letech dokázalo divy ** Používáme ho dnes každý den nejen ve vyhledávači ** A přesto se člověku nepřibližuje ani náznakem

Jakub Čížek | 59

Astronomové objevili daleko za Plutem objekt s extrémní dráhou. Může ukazovat na existenci planety Devět

Astronomové objevili daleko za Plutem objekt s extrémní dráhou. Může ukazovat na existenci planety Devět

** Astronomové objevili daleko za Neptunem těleso 2015 TG387 ** Okolo Slunce se pohybuje po extrémně protáhlé dráze ** Jeho dráha může ukazovat na existenci planety Devět

Petr Kubala | 10

Praktické vychytávky, které si chcete doinstalovat do Windows

Praktické vychytávky, které si chcete doinstalovat do Windows

** Pokud vás nudí vzhled nabídky Start, snadno jej můžete změnit. ** Stejně tak existují programy na přidání záložek do programů. ** Spokojit se ani nemusíte se základním ovládáním hlasitosti.

Vladislav Kluska | 46

Jak funguje největší akumulátor v Česku: podívejte se do elektrárny Dlouhé Stráně

Jak funguje největší akumulátor v Česku: podívejte se do elektrárny Dlouhé Stráně

** Přečerpávací vodní elektrárna Dlouhé stráně je obdivuhodné technické dílo ** Stejná turbína vyrábí elektřinu i tlačí vodu zpět do horního jezera ** Strojovna elektrárny je zabudována v podzemí

David Polesný | 35

Byli tam! Důkazy o přistání na Měsíci, Lunochody i čínská sonda jsou vidět z vesmíru

Byli tam! Důkazy o přistání na Měsíci, Lunochody i čínská sonda jsou vidět z vesmíru

** Sonda LRO pořídila z oběžné dráhy Měsíce zajímavé snímky ** Jsou na nich vidět artefakty všech misí programu Apolla, které přistály na povrchu Měsíce ** Jde například o části lunárních modulů, rovery a dokonce i vlajky

Petr Kubala | 65


Aktuální číslo časopisu Computer

Jak vytvořit a spravovat vlastní web

Velký test herních klávesnic a DVB-T2 tunerů

Vše o formátu RAW

Vybíráme nejlepší základní desku