Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

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

 
serhiyiv ©   (2010-04-25 16:14) [0]

Народ привет. Вопрос на засыпку :) Столкнулся с такой проблемой: не могу вывести оперу на передний план, с остальными програмами все работает. Причем вывести надо не по заголовку окна (он меняеться) а по класу. Клас (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) ;
////////////////////////////////////////////////////


 
serhiyiv ©   (2010-04-25 16:24) [1]

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


 
И. Павел ©   (2010-04-25 16:30) [2]

Похоже, OpWindow - это класс окна вкладки. Нужно искать класс главного окна.


 
И. Павел ©   (2010-04-25 16:31) [3]

Для демонстрации:
var Wnd:HWND;
begin
Wnd:= FindWindow("OpWindow", nil);
if (Wnd <> 0) then
  ShowWindow(Wnd, SW_SHOW);
end;


 
sniknik ©   (2010-04-25 16:35) [4]

> Забыл сказать что если использовать заголовок окна то процедура работает, а с класом не хочет.
???
у окна не может быть 2-х разных хендлов, одного для поиска по заголовку другого по классу.
что значит ты или не находишь окно или находишь не то (класс попутал).


 
И. Павел ©   (2010-04-25 16:47) [5]

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;


 
И. Павел ©   (2010-04-25 16:51) [6]

Посмотрел код - ну и извращение :) Может быть есть способ лучше?


 
Anatoly Podgoretsky ©   (2010-04-25 16:58) [7]

> serhiyiv  (25.04.2010 16:24:01)  [1]

Это не тот дескриптор, выведи значение в диалог и убедись, так что продолжай искать.


 
И. Павел ©   (2010-04-25 17:14) [8]

Класс у оперы тоже называется "OpWindow". Но у вкладок GetWindowText="". На основе этого можно найти окно оперы.


 
sniknik ©   (2010-04-25 17:26) [9]

> Может быть есть способ лучше?
ага, завсегда способ лучше это самому писать, а не искать по инету...

вот, чуть исправил чтобы класс показала. наверняка будет не такой как пытаешься использовать
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;


 
sniknik ©   (2010-04-25 17:27) [10]

> Класс у оперы тоже называется "OpWindow".
тогда должно по классу находить...


 
sniknik ©   (2010-04-25 17:30) [11]

хотя... а если у них несколько окон с одним классом? тогда нужно цикл уже по ним и смотреть в заголовок, как в примере, но не по всем окнам.


 
serhiyiv ©   (2010-04-25 17:56) [12]


> у окна не может быть 2-х разных хендлов, одного для поиска
> по заголовку другого по классу.что значит ты или не находишь
> окно или находишь не то (класс попутал).

Я говорю про то, что если, допустим открыта вкладка с названием "Опера  - веб",  Если сделать так (указать клас но не указывать название окна):

procedure Opera;
var
Wnd:HWND;
begin
Wnd:= FindWindow("Опера  - веб", nil);
if (Wnd <> 0) then SwitchToThisWindow(Wnd, True)

тогда все работает, выводит на передний план. А если указывать хендл окна и не указывать заголовок то не работает.

Так как же все - таки ето можно сделать? Перерыл нет, нашел пару примеров как вывести окно на передний план, но все они с Оперой не работают.


 
И. Павел ©   (2010-04-25 18:01) [13]


> serhiyiv ©   (25.04.10 17:56) [12]

А чем не устраивает каждый из предложенных вариантов?


 
serhiyiv ©   (2010-04-25 18:19) [14]

Ой немного не понял..... ОГРОМНООООООООООЕ СПАСИБО!!!!!!!!!!!!!!!!!!!!!


 
sniknik ©   (2010-04-25 19:11) [15]

> А если указывать хендл окна и не указывать заголовок то не работает.
если уже есть хендл, то никакие поиски больше не нужны. не нужно его нигде указывать, его можно просто использовать.


 
Омлет ©   (2010-04-25 22:10) [16]

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;


 
Игорь ©   (2010-04-25 22:33) [17]


> Омлет ©   (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:42) [18]


> serhiyiv ©   (25.04.10 16:14)  


Ну если смысл найти именно оперу может стоит получить VersionInfo exe файла?

GetWindowThreadProcessid и прочитать СompayName?



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.044 c
15-1262651153
Kerk
2010-01-05 03:25
2010.08.27
Петиция за сохранение MySQL


2-1267971766
pavel_guzhanov
2010-03-07 17:22
2010.08.27
как сравнить содержимое двух TImage?


15-1271142494
brother
2010-04-13 11:08
2010.08.27
Полицейским камерам угрожает взлом через номер автомобиля


15-1270502764
Юзер
2010-04-06 01:26
2010.08.27
Польза от интернета :)


2-1268556679
Ыфь86
2010-03-14 11:51
2010.08.27
не работает запрос по TCP