Title: retrieve a window handle?
AnimportantconceptinWindowsprogrammingistheconceptofanobjecthandle.
Manyfunctionsreturnahandletoanobjectthatthefunctioncreatedorloaded
fromaresource.Internally,Windowskeepstrackofallofthesehandles,
andthehandleservesasthelinkthroughtheoperatingsystembetweentheobject
andtheapplication.Thereareseveralwaystoobtainthehandleofawindow.
EinwichtigesKonzeptinderWindowsProgrammierungistdasKonzeptvomObjekt-Handle.
VieleFunktionengebeneinHandle(eigentlicheinZeiger)aufeinObjektzurck.
WindowsverwaltetinternalleHandles.
DiesedienenalsVerknpfungzwischenObjektundderApplikationberdasOS.
EsgibtverschiedeneWege,wiemannacheinemFensterhandlesuchenkann.
NachfolgendwerdeneinigeFunktionenzumSuchenvonFensternbesprochen
undineinigenBeipielenihreAnwendungenerlutert.
I)FindWindow
Syntax:
FindWindow(lpClassName:PChar;{apointertoanull-terminatedclassnamestring}
lpWindowName:PChar{apointertoanull-terminatedwindownamestring}
):HWND;{returnsahandletoawindow}
{
1.TheFindWindowfunctionretrievesthehandletothetop-level
windowwhoseclassnameandwindownamematchthespecifiedstrings.
Thisfunctiondoesnotsearchchildwindows.
Ifthefunctionsucceeds,thereturnvalueisthehandleto
thewindowthathasthespecifiedclassnameandwindowname.
Ifthefunctionfails,thereturnvalueis0.
1.DerFunktionsaufrufFindWindowliefertdasHandle
(vomTypHWND)aufdasgesuchteFenster,
dabeiwirdnichtnach"Kinder"-Fensterngesucht.
WenndieFunktion1zurckgibt,wurdedasentsprechendeFenster
gefunden.
Wennz.BnilalsKlassenNameangegebenwird,wirdder
1.ParamterignoriertundeswirdnurberdenFensternamengesucht.
Examples/Beispiele:
GetthehandleofNotepadbyitsClassname:
DasHandlevonNotepadberdenKlassennamenermitteln:
}
procedureTForm1.Button1Click(Sender:TObject);
var
hNotepadWindow:HWND;
begin
hNotepadWindow:=FindWindow('notepad',nil);
end;
{
GetthehandleofWinwordbyitsClassnameandhideit/showitafter2Sec.:
DasHandlevonWinwordberdenKlassennamenermittelnunddannWord
versteckenundnachnach2Sek.wiederanzeigen:
}
procedureTForm1.Button1Click(Sender:TObject);
var
hWordWindow:HWND;
begin
hWordWindow:=FindWindow('OpusApp',nil);
ShowWindow(hWordWindow,SW_HIDE);
Sleep(2000);
ShowWindow(hWordWindow,SW_SHOW);
end;
{
GetthehandleofInternetExplorerandminimize/closeallitswindows:
DashandlevomInternetExplorerermittelnunddanachall
seineFensterminimieren/schliessen:
}
procedureTForm1.Button1Click(Sender:TObject);
var
hIExplorer:HWND;
begin
hIExplorer:=FindWindow('IEFrame',nil);
ifhIExplorer0then
begin
//MinimizeIE:
SendMessage(hIExplorer,WM_SYSCOMMAND,SC_MINIMIZE,0);
//CloseIE:
SendMessage(hIExplorer,WM_SYSCOMMAND,SC_CLOSE,0);
end;
end;
II)GetWindow
{
FindWindowByTitlereturnsthehandleofawindowthat
containsacertain"WindowTitle".
FindWindowByTitlegibtdasHandlejenesFensterszurck,
dasimTiteldenString"WindowTitle"enthlt.
}
functionFindWindowByTitle(WindowTitle:string):Hwnd;
var
NextHandle:Hwnd;
NextTitle:array[0..260]ofchar;
begin
//Getthefirstwindow
NextHandle:=GetWindow(Application.Handle,GW_HWNDFIRST);
whileNextHandle0do
begin
//retrieveitstext
GetWindowText(NextHandle,NextTitle,255);
ifPos(WindowTitle,StrPas(NextTitle))0then
begin
Result:=NextHandle;
Exit;
end
else
//Getthenextwindow
NextHandle:=GetWindow(NextHandle,GW_HWNDNEXT);
end;
Result:=0;
end;
{
Examplehowtosearchforawindowthatcontainsthe
word"notepad"andmaximizeit.
Beispiel,wiemaneinFenster"notepad"findet
undesanschliessendmaximiert.
}
procedureTForm1.Button1Click(Sender:TObject);
var
h:hwnd;
begin
h:=FindWindowByTitle('notepad');
ifh0then//ifwefoundnotepad
ShowWindow(h,SW_MAXIMIZE)
else
ShowMessage('notfound.');
end;
III.FindWindowEx
{Syntax:}
FindWindowEx(Parent:HWND;{ahandletoaparentwindow}
Child:HWND;{ahandletoachildwindow}
ClassName:PChar;{apointertoanull-terminatedclassnamestring}
WindowName:PChar{apointertoanull-terminatedwindownamestring}
):HWND;{returnsahandletoawindow}
{Description:
FindWindowExretrievesthehandleofthewindowwiththespecified
classnameandwindowname.
UnlikeFindWindow,thisfunctionsearcheschildwindows,startingwith
theonefollowingthegivenchildwindow.
FindWindowExsuchtnach"Child"-FensterineinemFenster.
}
{
ExampletofindaTButton(ChildWindow)onaTForm
Beispiel,umnacheinemTButtonaufeinerFormzusuchen
}
procedureTForm1.Button1Click(Sender:TObject);
var
FoundWindow:HWND;
WindowText:array[0..255]ofchar;
begin
{FindaTButtonchildwindow}
FoundWindow:=FindWindowEx(Form1.Handle,0,'TButton',nil);
{Getitstext}
GetWindowText(FoundWindow,WindowText,255);
{Displayit}
label1.Caption:='FindWindowExfoundwindowhandle'+
IntToStr(FoundWindow)+':'+WindowText;
end;
{
ExampletosearchforEditfieldnr.xinanotherapplicationandsendatexttoit
Beispiel,wiemannachdemX.FeldineineranderenApplikationsucht
undeinTextschickt.
}
functionFindControlByNumber(hApp:HWND;ControlClassName:string;ControlNr:Word=1):HWND;
var
i:Word;
hControl:HWND;
begin
Result:=0;
ifIsWindow(hApp)then
begin
Dec(ControlNr);
hControl:=0;
fori:=0toControlNrdo
begin
hControl:=FindWindowEx(hApp,hControl,PChar(ControlClassName),nil);
ifhControl=0then
Exit;
end;
end;
Result:=hControl;
end;
procedureSetEditText(hApp:HWND;EditClassName,AText:string;EditNr:Integer);
var
hEdit:HWND;
begin
//Searchforthe2.EditFieldinaapplication
hEdit:=FindControlByNumber(FindWindow('Write_Here_Class_Of_App',nil),'Edit',2);
ifhEdit0then
//Test:Senda"Hello"totheEditField
SendMessage(hEdit,WM_SETTEXT,0,Integer(PChar('Hello')));
end;
IV)EnumWindows
//Syntax:
EnumWindows(lpEnumFunc:TFNWndEnumProc;{theaddressoftheenumerationcallbackfunction}
lParam:LPARAM{a32-bitapplication-definedvalue}
):BOOL;{returnsTRUEorFALSE}
{
TheEnumWindowsfunctionenumeratesalltop-levelwindows
onthescreenbypassingthehandleofeachwindow,in
turn,toanapplication-definedcallbackfunction.
EnumWindowscontinuesuntilthelasttop-levelwindowisenumerated
orthecallbackfunctionreturnsFALSE.
DieEnumWindowsFunktionzhltalleTop-LevelFenster
aufundgibtjeweilsdasHandlezurck.
EnumWindowsendet,wenndasletzteFensteraufgezhltwurde
oderdieCallback-FunktionFalsezurckgibt.
CallbackSyntax:}
EnumWindowsProc(hWnd:HWND;{ahandletoatop-levelwindow}
lParam:LPARAM{theapplication-defineddata}
):BOOL;{returnsTRUEorFALSE}
{
ExamplehowtolistallTop-LevelWindowsinaListbox.
NachfolgendeinBeispiel,umalleTop-LevelFensterin
einerListboxanzuzeigen.
}
functionEnumWindowsProc(wHandle:HWND;lb:TListBox):Bool;stdcall;export;
var
Title,ClassName:array[0..255]ofchar;
begin
Result:=True;
GetWindowText(wHandle,Title,255);
GetClassName(wHandle,ClassName,255);
ifIsWindowVisible(wHandle)then
lb.Items.Add(string(Title)+'-'+string(ClassName));
end;
procedureTForm1.Button1Click(Sender:TObject);
begin
EnumWindows(@EnumWindowsProc,Integer(Listbox1));
end;
V)EnumChildWindows
//Syntax:
EnumerateChildWindows(hWnd:HWND;{ahandletoatop-levelwindow}
lParam:LPARAM):{a32-bitapplication-definedvalue}
BOOL;stdcall;{returnsTRUEorFALSE}
{Description:
TheEnumChildWindowsfunctionenumeratesthechildwindowsthatbelongtothe
specifiedparentwindowbypassingthehandleofeachchildwindow,inturn,
toanapplication-definedcallbackfunction.
EnumChildWindowscontinuesuntilthelastchildwindowisenumeratedor
thecallbackfunctionreturnsFalse.
DieEnumChildWindowsFunktionzhltallezueinemFenstergehrendenChild-Fenster
aufundbergibtjeweilsdasHandleeinerCallbackFunktion.
EnumChildWindowsendet,wenndasletzteChild-Fensteraufgezhltwurde
oderdieCallback-FunktionFalsezurckgibt.
HereisanexamplethatliststhecontrolsonaTPrintDialog
HiereinBeispiel,umalleControlsaufeinesTPrintDialogsanzuzeigen
}
functionEnumProc(wnd:HWND;Lines:TStrings):BOOL;stdcall;
var
buf,Caption:array[0..255]ofchar;
begin
Result:=True;
GetClassName(wnd,buf,SizeOf(buf)-1);
SendMessage(wnd,WM_GETTEXT,256,Integer(@Caption));
Lines.Add(Format('ID:%d,ClassName:%s,Caption:%s',
[GetDlgCtrlID(wnd),buf,Caption]));
end;
procedureTForm1.PrintDialog1Show(Sender:TObject);
begin
Memo1.Clear;
EnumChildWindows(printdialog1.Handle,@EnumProc,Integer(memo1.Lines));
end;
VI)EnumThreadWindows
//Syntax:
EnumThreadWindows(dwThreadId:DWORD;{thethreadidentificationnumber}
lpfn:TFNWndEnumProc;{theaddressoftheenumerationcallbackfunction}
lParam:LPARAM{a32-bitapplication-definedvalue}
):BOOL;{returnsTRUEorFALSE}
{Description/Beschreibung
Thisfunctionenumeratesallofthenonchildwindowsassociatedwiththespecifiedthread.
Eachwindowhandleassociatedwiththespecifiedthreadispassedtoan
application-definedcallbackfunction.Thisfunctionwillcontinueuntil
allofthewindowsareenumeratedorthecallbackfunctionreturnsFalse.
DieseFunktionlistetalle"nonchild"-FenstereinesThreadsauf.
JedesmitdiesemTreadverknpfteFensterwirdaneineCallbackFunktionbergeben.
DieseFunktionwirdsolangeausgefhrt,bisalleFentsteraufgezhltwurdenoder
bisdieCallbackFunktionFalsezurckgibt.
SyntaxoftheCallbackfunction:
SyntaxderCallbackFunktion:
}
EnumThreadWndProc(hWnd:HWND;{ahandletoawindow}
lParam:LPARAM{theapplication-defineddata}
):BOOL;
{
Example:FindingallWindowsbelongingtoaThread
Beispiel:AllezueinemThreadgehrendenFensterauflisten
}
functionEnumerateThreadWindows(Wnd:HWND;Data:lParam):BOOL;
var
WindowText:array[0..255]ofchar;//holdsthetextofthewindow
begin
{Getthetextfromthewindow}
GetWindowText(Wnd,WindowText,255);
{Displayitinthelistbox}
Form1.ListBox1.Items.Add(WindowText);
{Continuetheenumeration}
Result:=True;
end;
procedureTForm1.Button1Click(Sender:TObject);
begin
{Clearthelistbox}
ListBox1.Items.Clear;
{Enumerateallwindowsthatbelongtothecurrentthread}
EnumThreadWindows(GetCurrentThreadID,@EnumerateThreadWindows,0);
end;