Текущий архив: 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.49 MB
Время: 0.057 c