Как найти окно по неполному названию?
Как найти окно по неполному названию?
Код не мой, взят где-то из интернета, авторство не помню, я его работоспособность проверял, но почему-то работает не в 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;
Автор ответа: Vit
Взято с Vingrad.ru
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;
Автор ответа: Mikel
Взято с Vingrad.ru