Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2008, 16:59   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Перенаправление для сворачивание окна

Создал хук глобальный с WH_CBT и ловлю HCBT_MINMAX и соотвтественно SW_MINIMIZE. Посылаю сообщение через SendMessage программе в длл возращаю результат 0 или прерываю цепь хука ( exit ).
В программе все нормально... и вот теперь вопрос. При вызове свертывания окна в моей программе делаю ShowWindow(Window, SW_HIDE) НО окно остается всеравно на панели задач, это раз, второе то, что при восстановлении ShowWindow(Window, SW_RESTORE) окно появляется но появляется с анимацией из панели задач. И соответственно, как убрать с панели задач и убрать анимацию ( хотя чувствую что анимация эта, и есть последствие, что окно не было убранно из панели задач ).
p.s. Спасибо, надеюсь что хоть на этот вопрос ответит ктонить
BOBAH13 вне форума Ответить с цитированием
Старый 03.10.2008, 18:32   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Посылаю сообщение через SendMessage программе в длл возращаю результат 0 или прерываю цепь хука ( exit ).
а какой сообщение ты посылаешь?

вообще-то не рекомендуется в обработчике хука посылать сообщения так как снова может вызваться этот же обработчик и получиться бесконечная "рекурсия".
rpy3uH вне форума Ответить с цитированием
Старый 03.10.2008, 19:02   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

А если и посылать, то через PostMessage, ибо оно не ждёт возвращения результата
пыщь
JTG вне форума Ответить с цитированием
Старый 03.10.2008, 19:18   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

А вопрос ведь не про хук:

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
... и вот теперь вопрос. При вызове свертывания окна в моей программе делаю ShowWindow(Window, SW_HIDE) НО окно остается всеравно на панели задач, это раз, второе то, что при восстановлении ShowWindow(Window, SW_RESTORE) окно появляется но появляется с анимацией из панели задач. И соответственно, как убрать с панели задач и убрать анимацию ( хотя чувствую что анимация эта, и есть последствие, что окно не было убранно из панели задач ).
p.s. Спасибо, надеюсь что хоть на этот вопрос ответит ктонить
Это не подойдет ? :
Код:
{$J+}
const b:boolean = true;
procedure TForm4.Timer1Timer(Sender: TObject);
begin
   if b then begin
      SetWindowLong(Application.Handle, GWL_HWNDPARENT, GetDesktopWindow());
      //ShowWindow(Application.Handle, SW_MINIMIZE);
      ShowWindow(Form4.Handle, SW_HIDE);
   end else begin
      ShowWindow(Form4.Handle, SW_SHOW);
      //ShowWindow(Application.Handle, SW_RESTORE);
      SetWindowLong(Application.Handle, GWL_HWNDPARENT, 0);
   end;
   b := not b;
end;
alexBlack вне форума Ответить с цитированием
Старый 03.10.2008, 20:28   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

2 rpy3uH: незнаю что вы там имели ввиду, я посылаю свое определенное сообщение которое информирует приложение о сворачиваемом окне

2 JTG: именно SendMessage чтобы не сработал дефолтный минимизатор окна ну я так сделал... т.к. при обработке сообщения моя приложение то окно скроет через ShowWindow(...SW_HIDE)...

2 alexBlack: не понял. Окно не мое, а любое которое в системе есть. Например у меня окно тот же explorer - мой компьютер я его скрываю ShowWindow(..SW_HIDE) но всеравно остается на панели задач.

Никто ничего больше не подскажет ? прийдется.. наверное опять сидеть и крутить вертеть msdn + google...
BOBAH13 вне форума Ответить с цитированием
Старый 03.10.2008, 20:55   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
2 alexBlack: не понял. Окно не мое, а любое которое в системе есть. Например у меня окно тот же explorer - мой компьютер я его скрываю ShowWindow(..SW_HIDE) но всеравно остается на панели задач.
то-же с чужим окном:
(с панели задач исчезает, анимации нет)

Код:
{$J+}
const b:boolean = true;
procedure TForm4.Timer1Timer(Sender: TObject);
var h:THandle;
begin
   h := FindWindow('notepad', nil);
   if h = 0 then exit;
   
   if b then begin
      SetWindowLong(h, GWL_HWNDPARENT, GetDesktopWindow());
      ShowWindow(h, SW_HIDE);
   end else begin
      ShowWindow(h, SW_SHOW);
      SetWindowLong(h, GWL_HWNDPARENT, 0);
   end;
   b := not b;
end;

Последний раз редактировалось alexBlack; 03.10.2008 в 21:02.
alexBlack вне форума Ответить с цитированием
Старый 03.10.2008, 21:12   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

У меня ничего не исчезло...
сделал так:

вычитал что всплывающие окна ( WS_POPUP стиль ) не отображаются на панели задач и соответственно их детишки.... создал окно PopupWindow с классом WS_POPUP и потом при скрытии окна:

Код:
WindowParent := Windows.GetParent(WND);
Windows.SetParent(WND, PopupWindow);
ShowWindow(WND, SW_HIDE);
и при отображении обратно:

Код:
Windows.SetParent(WND, WindowParent);
ShowWindow(WND, SW_SHOW);
SetForegroundWindow(WND);  
UpdateWindow(WND);
вроде работает
BOBAH13 вне форума Ответить с цитированием
Старый 03.10.2008, 21:27   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Еще вопрос, может конечно уже немного не то, но всеравно похоже
есть два окна, они как слои, один ниже другого. И вот как бы их синхронизировать? Ну они не двигаются, все вроде бы просто, как только активируется нижнее активируется и верхний. А вот как сделать чтобы они были вместе выше всех других окон. Я делал через SetWindowPos ( TOPMOST ) но так работает только одно окно из двух моих. Не подскажите ?
BOBAH13 вне форума Ответить с цитированием
Старый 06.10.2008, 22:27   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

И вот я вернулся. Ставил хук HCBT но в обработчике

Код:
function HookWndProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
  if (code = HCBT_MINMAX) then
  begin
    if (LOWORD(lparam) = SW_MINIMIZE) then
    begin
      PostMessage(Data^.Wnd, WM_HWINDOWMINMAX, wparam, 0);
    end else      
    if (LOWORD(lparam) = SW_RESTORE) then
      PostMessage(Data^.Wnd, WM_HWINDOWMINMAX, wparam, 1);
  end;
  Result := CallNextHookEx(Data^.HookWnd, code, wparam, lparam);
end;
странно но в висте не работает, а в xp со временем перестает работать. Вопрос: как сделать перехват сворачивания окна, т.е. получаем хендл окна которое собирается свернутся мы отменяем свертывание и постим мою мессагу WM_HWINDOWMINMAX. Не подскажите ? Помогите... уже незнаю что можно придумать, перехватывать api чтот не очень хочется...
BOBAH13 вне форума Ответить с цитированием
Старый 09.10.2008, 11:21   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Надо было просто вернуть когда SW_MINIMIZE -> Result := 1; и прервать цепочку хука. Но вод вопрос, вызываю ShowWindow(wparam, SW_HIDE); для всех окон работает, но вот к примеру та же Delphi7 не сворачивается... может знаите как с имитировать сворачивание для любого окна ?
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отследить нажатие клавиши для отдельного окна Черничный Win Api 12 13.09.2008 20:47
Перенаправление портов ADSoft Безопасность, Шифрование 2 05.01.2008 00:30
Перенаправление потоков Carbon Win Api 5 25.11.2007 14:46
Автоматическое перенаправление на др. стр. Рустам PHP 2 17.11.2007 15:43
TWebBrowser-как перехватить команду скрипта для закрытия окна и не дать ему закрыться Вовик Компоненты Delphi 5 03.10.2007 12:17