Mega Code Archive

 
Categories / Delphi / Forms
 

Retrieve a window handle

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;