![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поднять окно excel. [D6, Win2k]
samalex © (2004-10-05 17:36:00)Уважаемые знатоки!!! Помогите решить проблему.
Есть оболочка, программа, написанная другими людьми, которая создает окна-документы, видимо, посредством VBA. Так вот, эти окна прячутся под саму оболочку. Я посмотрел, в процессах они называютя Excel.exe.
Вопрос, как эти окна искать и выталкивать на передний план. Написать резидентную программу. В принципе это возможно?
samalex (2004-10-06 10:06:00) [1]programania
procedure TF_Menu00.Button1Click(Sender: TObject);
var
Wnd, Wnd1 : integer;
buff : ARRAY[0.. 127] OF Char;
_Handle : HWND;
begin
Wnd := GetWindow(Application.Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO
BEGIN
GetWindowText (Wnd, buff, sizeof (buff ));
If (Trim(StrPas(buff))='График') then
begin
SetForegroundWindow(Wnd);
Exit;
end;
Wnd := GetWindow (Wnd, gw_hWndNext);
END;
По нажатию этой кнопки окно с Title "График" находится и выводится на передний план. Но мне нужна автоматическая работа - без нажатия кнопки. Я поставил таймер с интервалом 1 сек и обработчиком поставил эту функцию. Проблема - программа работает, если окно этой программы активно, если нет, то "График" не поднимается. Пробовал ставить
SetActiveWindow(Application.Handle);
не помогает.
olookin (2004-10-05 18:41:00) [2]Вот этот пример (при небольшом видоизменении) делает именно отображение исходно скрытого окна Excel
procedure TForm1.Activateapplication1Click(Sender: TObject);
var tl: string;
begin
tl:=selecteditem.Caption; h:=Form1.Handle; h1:=h; no:=false;
while no=false do begin h:=GetNextWindow(h,GW_HWNDNEXT);
if h=0 then no:=true; GetWindowText(h,p,255); s:=StrPas(p);
if s=tl then begin ShowWindow(h,SW_RESTORE); SetForegroundWindow(h);
RedrawWindow(h,0,0,RDW_VALIDATE and RDW_UPDATENOW and RDW_ALLCHILDREN);
no:=true; break; end; end;
if no=false then begin h:=h1;
while no=false do begin h:=GetNextWindow(h,GW_HWNDPREV);
if h=0 then no:=true; GetWindowText(h,p,255); s:=StrPas(p);
if s=tl then begin ShowWindow(h,SW_RESTORE); SetForegroundWindow(h);
RedrawWindow(h,0,0,RDW_VALIDATE and RDW_UPDATENOW and RDW_ALLCHILDREN);
no:=true; break; end; end; end;
end;
programania (2004-10-05 18:40:00) [3]FindWindow+F1
SetForegroundWindow+F1
samalex (2004-10-05 18:32:00) [4]Я не сам создаю Excel-объект, а ищу уже готовый и мне нужно вывести его наверх.
Роман Снегирев (2004-10-05 17:59:00) [5]Excel.Visible:=True
olookin (2004-10-05 17:43:00) [6]Возможно. Можно определять их по содержимому имени окна - окна Excel содержат текст Microsoft Excel. Определять handle такого окна и работать с ним...