Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.04.2009, 19:29
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
Восклицание Скрыть окно

Необходимо скрыть чужое окно по заголовку. При этом может быть запущено несколько окон с одинаковыми заголовками, надо их как-либо пронумировать и выбирать - скрыть/отобразить. Я надеюсь на вашу помощь.

искать окно будем при помощи findwindow, а чтобы скрывать окно (точно не знаю, но думаю надо копать sendmessage) нужны какие либо параметры/процедуры.

и как искать окна с одинаковыми заголовками? (например нумировать посредством PID, или порядок запущеных окон.

Заранее спасибо!
Ответить с цитированием
  #2  
Старый 15.04.2009, 19:32
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Скрыть - послать сообщение SW_HIDE.
Перебор окон - см. EnumWindows. Получаешь хэндл окна (кстати, вот тебе нумератор, т.к. он повторяться не может), по нему вытаскиваешь заголовок и по нему же посылаешь сообщение.
Ответить с цитированием
  #3  
Старый 15.04.2009, 21:46
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

вот код проги, которая выводит в мемо имена всех найденых окон:
Код:
procedure GetWinsNames(var outName: string);
var
  Wnd: hWnd;
  buff: array [0..127] of Char;
begin
  outName:= '';
  Wnd:= GetWindow(Form1.Handle, gw_HWndFirst);
  while Wnd <> 0 do
  begin
    ZeroMemory(@buff, SizeOf(buff));
    if (Wnd<>Application.Handle) and
      (IsWindowVisible(Wnd){or checkbox1.checked}) and   //checkbox1.checked - показывать скрытые окна
      ((GetWindow(Wnd, gw_Owner)=0) {or checkbox2.checked}) and //checkbox2.checked - показывать остальные окна
      (GetWindowText(Wnd, buff, SizeOf(buff))<>0) then
    begin
      outName:= outName + buff + #13#10;
      //тут можно поколдавать с Wnd
    end;
    Wnd:= GetWindow(Wnd, gw_hWndNext);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  GetWinsNames(s);
  Memo1.Text:= s;
end;
В строчке "//тут можно поколдавать с Wnd" можно поработать с окном (закрыть, свернуть и т.п.)
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
  #4  
Старый 15.04.2009, 22:37
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

Цитата:
Сообщение от lmikle
Скрыть - послать сообщение SW_HIDE.
Перебор окон - см. EnumWindows. Получаешь хэндл окна (кстати, вот тебе нумератор, т.к. он повторяться не может), по нему вытаскиваешь заголовок и по нему же посылаешь сообщение.

я понимаю что SW_HIDE, я несовсем знаю sendmessage..

SendMessage(hand_le, {тут?}, {тут?}, {тут?});

гдето SW_HIDE, понятно, и где? и что в остальных параметрах?
Ответить с цитированием
  #5  
Старый 15.04.2009, 22:45
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Цитата:
Сообщение от ApplicatiOn
я понимаю что SW_HIDE, я несовсем знаю sendmessage..

SendMessage(hand_le, {тут?}, {тут?}, {тут?});

гдето SW_HIDE, понятно, и где? и что в остальных параметрах?
Код:
ShowWindow(Handle, SW_HIDE);
или так
Код:
SendMessage(Handle, WM_SHOWWINDOW, SW_HIDE, sw_ParentClosing);
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.

Последний раз редактировалось Karsh, 15.04.2009 в 22:48.
Ответить с цитированием
  #6  
Старый 16.04.2009, 09:50
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

спасибо, а что делать с полноэкранными приложениями? при скрытии они сворачиваются, а потом только скрываются.. а то оно мерцает и все..
Ответить с цитированием
  #7  
Старый 16.04.2009, 11:06
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

обычно полноэкранные приложения имет стил "по верх всех окон", может из-за этого и появляется данная проблема.
попробуйте сделать так:
Код:
var
  EStyle: DWORD;
begin
  EStyle:= GetWindowLong(Handle, GWL_EXSTYLE);
  SetWindowLong(Handle, GWL_EXSTYLE, EStyle or WS_EX_TOPMOST);
но я не уверен, что поможет...
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
  #8  
Старый 16.04.2009, 11:11
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

да, без изменений.. но всеравно спасибо...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:22.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025