Hvis du vil simulere tastetryk til et felt i en anden app. skal du først have en handle til feltet. Den kan du finde ved at bruge API-funktionen FindWindowEx.
Problemet er dog man skal anvende Class-names og at de dels er ukendte samt at man i første omgang kun finder top-level vinduer. Det felt (edit-kontrol) man vil skrive til ligger dybere i den pågældende app.'s vindueshieraki. For at finde disse kan du anvende WinSight som følger med Delphi.
Her kan man for Internet Explorer se at Class Name for hovedvinduet er "IEFrame". Adresse-editkontrollen er begravet i flg. vinduer (class names): "IEFrame + WorkerW + ReBarWindow32 + ComboBoxEx32 + ComboBox + Edit".
Når du har handlen kan du sende "taste-tryk" til denne via API-funktionen SendMessage med brug af WM_KEYDOWN, WM_CHAR og WM_KEYUP. Til disse messages anvendes Virtual-Key Codes som findes i Win 32 SDK Reference. Det er dog meget nemmere blot at sende hele teksten, såfremt det er en Edit-kontrol og så kun simulere en <return>.
Flg. kode sender et link til Internet Explorer (hvis den er åben) og siden skulle gerne skifte til den angivne adresse (testet med IE 6.0):
procedure OpenLink(Link: String);
var
HMain, HChild: HWND;
begin
// NB! ingen check på om link er valid
HMain := FindWindowEx(0, 0, 'IEFrame', nil);
if HMain > 0 then
begin
HChild := FindWindowEx(HMain, 0, 'WorkerW', nil);
if HChild > 0 then
HChild := FindWindowEx(HChild, 0, 'ReBarWindow32', nil);
if HChild > 0 then
HChild := FindWindowEx(HChild, 0, 'ComboBoxEx32', nil);
if HChild > 0 then
HChild := FindWindowEx(HChild, 0, 'ComboBox', nil);
if HChild > 0 then
HChild := FindWindowEx(HChild, 0, 'Edit', nil);
if HChild > 0 then
begin
SendMessage(HChild, wm_SetText, 0, Integer(PChar(Link)));
SendMessage(HChild, wm_KeyDown, VK_RETURN, 0);
SendMessage(HChild, wm_KeyUp, VK_RETURN, 0);
end;
end else
ShowMessage('Explorer not found...');
end;
Er dit problem, at du "kun" ønsker at sende links til IE ville det være meget nemmere at gøre som følger:
uses
ShellAPI;
procedure OpenLink(Link: String);
begin
// NB! ingen check på om link er valid
// Åbner Explorer, såfremt ingen instanser findes.
// Ellers åbnes i "øverste" instans.
ShellExecute(0, 'Open', PChar(Link), nil, nil, sw_Show);
end;
Denne kode kan for i øvrigt anvendes til meget andet idet
f.eks
ShellExecute(0, 'Open', PChar(ExtractFileDir(ParamStr(0))), nil, nil, sw_Show);
vil åbne Stifinder i det dir hvor den kaldende exe ligger.
Herudover kan man kalde (=åbne) andre exe-filer eller åbne filer med registrerede extensions (.txt, *.hlp o.s.v.)
eks.: ShellExecute(0, 'Open', 'C:\\blabla.txt', nil, nil, sw_Show);
vil åbne blabla.txt i Notepad.
mvh
hsv
[Redigeret d. 16/11-04 11:03:27 af HSV][Redigeret d. 16/11-04 11:04:16 af HSV]