![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить дескриптор окна ОПЕРЫ!!!
serhiyiv © (2010-04-25 16:14:00)Народ привет. Вопрос на засыпку :) Столкнулся с такой проблемой: не могу вывести оперу на передний план, с остальными програмами все работает. Причем вывести надо не по заголовку окна (он меняеться) а по класу. Клас (OpWindow) находит, но на передний план не выводит, зато окно моей програмы теряет фокус. Как ето реализировать?
procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall;
external user32 Name 'SwitchToThisWindow';
procedure Opera;
var
Wnd:HWND;
begin
Wnd:= FindWindow(PChar('OpWindow'),nil);
if (Wnd <> 0) then SwitchToThisWindow(Wnd, True) ;
////////////////////////////////////////////////////
Игорь (2010-04-25 22:42:00) [1]
> serhiyiv © (25.04.10 16:14)
Ну если смысл найти именно оперу может стоит получить VersionInfo exe файла?
GetWindowThreadProcessid и прочитать СompayName?
Игорь (2010-04-25 22:33:00) [2]
> Омлет © (25.04.10 22:10) [16]
Заголовок IE
$ http://yandex.ru/yandsearch?text= opera&clid=40316&lr=213&ex=v11&stpar2=%2Fh1%2Ftm7%2Fs1&stpar4=%2Fs1&stpar1=%2Fu0
Тоже определится как броузер Opera?
Омлет (2010-04-25 22:10:00) [3]
function GetOperaWindow: HWND;
var Wnd: HWND;
Buff: array [0..127] of Char;
begin
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
if Pos('Opera', StrPas(Buff)) > 0 then begin
Result := Wnd;
Exit;
end;
end;
Wnd := GetWindow(Wnd, GW_HWNDNEXT);
end;
Result := 0;
end;
sniknik (2010-04-25 19:11:00) [4]> А если указывать хендл окна и не указывать заголовок то не работает.
если уже есть хендл, то никакие поиски больше не нужны. не нужно его нигде указывать, его можно просто использовать.
serhiyiv (2010-04-25 18:19:00) [5]Ой немного не понял..... ОГРОМНООООООООООЕ СПАСИБО!!!!!!!!!!!!!!!!!!!!!
И. Павел (2010-04-25 18:01:00) [6]
> serhiyiv © (25.04.10 17:56) [12]
А чем не устраивает каждый из предложенных вариантов?
serhiyiv (2010-04-25 17:56:00) [7]
> у окна не может быть 2-х разных хендлов, одного для поиска
> по заголовку другого по классу.что значит ты или не находишь
> окно или находишь не то (класс попутал).
Я говорю про то, что если, допустим открыта вкладка с названием "Опера - веб", Если сделать так (указать клас но не указывать название окна):
procedure Opera;
var
Wnd:HWND;
begin
Wnd:= FindWindow("Опера - веб", nil);
if (Wnd <> 0) then SwitchToThisWindow(Wnd, True)
тогда все работает, выводит на передний план. А если указывать хендл окна и не указывать заголовок то не работает.
Так как же все - таки ето можно сделать? Перерыл нет, нашел пару примеров как вывести окно на передний план, но все они с Оперой не работают.
sniknik (2010-04-25 17:30:00) [8]хотя... а если у них несколько окон с одним классом? тогда нужно цикл уже по ним и смотреть в заголовок, как в примере, но не по всем окнам.
sniknik (2010-04-25 17:27:00) [9]> Класс у оперы тоже называется 'OpWindow'.
тогда должно по классу находить...
sniknik (2010-04-25 17:26:00) [10]> Может быть есть способ лучше?
ага, завсегда способ лучше это самому писать, а не искать по инету...
вот, чуть исправил чтобы класс показала. наверняка будет не такой как пытаешься использовать
procedure TForm1.Button1Click(Sender: TObject);
var
ClassName: string;
function GetOperaHandle: THandle;
var
Find, Header: Array[byte] of Char;
Hndl: THandle;
begin
result:= 0;
StrPCopy(Find, 'opera');
Hndl:= FindWindow(nil, nil);
while Hndl <> 0 do begin
GetWindowText(Hndl, Header, 256);
if Pos(Find, LowerCase(Header)) > 0 then begin
result:= Hndl;
GetClassName(Hndl, Find, 256);
ClassName:= Find;
Exit;
end;
Hndl:= GetWindow(Hndl, GW_HWNDNEXT);
end;
end;
begin
Edit1.Text:= IntToStr(GetOperaHandle) + ' : ' + ClassName;
end;
И. Павел (2010-04-25 17:14:00) [11]Класс у оперы тоже называется 'OpWindow'. Но у вкладок GetWindowText=''. На основе этого можно найти окно оперы.
Anatoly Podgoretsky (2010-04-25 16:58:00) [12]> serhiyiv (25.04.2010 16:24:01) [1]
Это не тот дескриптор, выведи значение в диалог и убедись, так что продолжай искать.
И. Павел (2010-04-25 16:51:00) [13]Посмотрел код - ну и извращение :) Может быть есть способ лучше?
И. Павел (2010-04-25 16:47:00) [14]Google знает ответ:
function GetOperaHandle : hWnd;
var
App, Wt : Array[0..255] of Char;
H : HWnd;
begin
StrPCopy(App, 'Opera');
H := FindWindow(nil, nil);
GetWindowText(H, Wt, 255);
if (Pos(LowerCase(App), LowerCase(Wt)) > 0) then
begin
Result := H;
Exit;
end;
while H <> 0 do
begin
H := GetWindow(H, GW_HWndNext);
GetWindowText(H, Wt, 255);
if (Pos(LowerCase(App), LowerCase(Wt)) > 0) then
begin
Result := H;
Exit;
end;
end;
Result := 0;
end;
sniknik (2010-04-25 16:35:00) [15]> Забыл сказать что если использовать заголовок окна то процедура работает, а с класом не хочет.
???
у окна не может быть 2-х разных хендлов, одного для поиска по заголовку другого по классу.
что значит ты или не находишь окно или находишь не то (класс попутал).
И. Павел (2010-04-25 16:31:00) [16]Для демонстрации:
var Wnd:HWND;
begin
Wnd:= FindWindow('OpWindow', nil);
if (Wnd <> 0) then
ShowWindow(Wnd, SW_SHOW);
end;
И. Павел (2010-04-25 16:30:00) [17]Похоже, OpWindow - это класс окна вкладки. Нужно искать класс главного окна.
serhiyiv (2010-04-25 16:24:00) [18]Забыл сказать что если использовать заголовок окна то процедура работает, а с класом не хочет.