Главная страница
    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.064 c
15-1263977721
картман
2010-01-20 11:55
2010.08.27
Обработка ошибок


15-1266874205
Юрий
2010-02-23 00:30
2010.08.27
С днем рождения ! 23 февраля 2010 вторник


2-1266086179
Interesting
2010-02-13 21:36
2010.08.27
Иконка в SysTray и форма


3-1240229501
Wood
2009-04-20 16:11
2010.08.27
Помогите с приложение для работы через ADO с бд.


15-1272745804
Юрий
2010-05-02 00:30
2010.08.27
С днем рождения ! 2 мая 2010 воскресенье





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский