Как найти окно по неполному названию?
Материал из DRKB
Как найти окно по неполному названию?[править | править код]
Код не мой, взят где-то из интернета, авторство не помню, я его работоспособность проверял, но почему-то работает не в 100% случаев, копать дальше не было времени, но может кому пригодится и в таком варианте.
type
PFindWindowStruct = ^TFindWindowStruct;
TFindWindowStruct = record
Caption: string;
ClassName: string;
WindowHandle: THandle;
end;
function EnumWindowsProc(hWindow: hWnd; lParam: LongInt): Bool; stdcall;
var
lpBuffer: PChar;
WindowCaptionFound: bool;
ClassNameFound: bool;
begin
GetMem(lpBuffer, 255);
Result := True;
WindowCaptionFound := False;
ClassNameFound := False;
try
if GetWindowText(hWindow, lpBuffer, 255) > 0 then
if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0 then
WindowCaptionFound := True;
if PFindWindowStruct(lParam).ClassName = '' then
ClassNameFound := True
else if GetClassName(hWindow, lpBuffer, 255) > 0 then
if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer)) > 0 then
ClassNameFound := True;
if (WindowCaptionFound and ClassNameFound) then
begin
PFindWindowStruct(lParam).WindowHandle := hWindow;
Result := False;
end;
finally
FreeMem(lpBuffer, SizeOf(lpBuffer^));
end;
end;
function FindAWindow(Caption: string; ClassName: string): THandle;
var WindowInfo: TFindWindowStruct;
begin
WindowInfo.Caption := Caption;
WindowInfo.ClassName := ClassName;
WindowInfo.WindowHandle := 0;
EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
FindAWindow := WindowInfo.WindowHandle;
end;
procedure TForm1.Button1Click(Sender: TObject);
var TheWindowHandle: THandle;
begin
TheWindowHandle := FindAWindow('Opera', '');
if TheWindowHandle <> 0 then
begin
Showwindow(TheWindowHandle, sw_restore);
BringWindowToTop(TheWindowHandle);
end
else
ShowMessage('Window Not Found!');
end;
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 02097
function TForm1.Find(s: string): hWnd;
var
Wnd: hWnd;
buff: array[0..127] of Char;
begin
Find := 0;
Wnd := GetWindow(Handle, gw_HWndFirst);
while Wnd <> 0 do
begin
if (Wnd <> Application.Handle)
and IsWindowVisible(Wnd)
and (GetWindow(Wnd, gw_Owner) = 0)
and (GetWindowText(Wnd, buff, SizeOf(buff)) <> 0)
then
begin
GetWindowText(Wnd, buff, SizeOf(buff));
if Pos(s, StrPas(buff)) > 0 then
begin
Find := Wnd;
Break;
end;
end;
Wnd := GetWindow(Wnd, gw_hWndNext);
end;
end;
Author: Mikel
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 02098