Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.089 c
2-1269717199
Studd
2010-03-27 22:13
2010.08.27
Алгоритм заполнения фигуры


15-1267230629
Юрий
2010-02-27 03:30
2010.08.27
С днем рождения ! 27 февраля 2010 суббота


15-1272703696
Pavia
2010-05-01 12:48
2010.08.27
numerical recipes


15-1275738264
Desdechado
2010-06-05 15:44
2010.08.27
Если б человек не мог врать, как изменился бы мир?


2-1269197259
Fr
2010-03-21 21:47
2010.08.27
TRichEdit и SelStart





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский