Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получить дескриптор окна ОПЕРЫ!!!


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]

Забыл сказать что если использовать заголовок окна то процедура работает, а с класом не хочет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо