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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2008, 10:35   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
Злость Проблемы с WIN+D

Привет всем...
Мне придеться опять расписать, но что поделаешь, жизнь такая...
Есть приложние, и у него есть форма form1: tForm1;
Есть процедура showHide, которая срабатывает, допустим при клике по иконки в трее этого приложения.
Иконка приложения в таскБаре отображаться никогда не должна!.
Проседура showHide
у меня выглядеть примерно так:
Код:
procedure tForm1.showHide;
begin
   { если форма отображаеть, то спрятать её, иначе, показать }
   if IsWindowVisible(handle) then
   begin
      ShowWindow(Application.Handle, SW_HIDE);
      ShowWindow(Application.MainForm.Handle, SW_HIDE);
   end
   else
   begin
      ShowWindow(Application.Handle, SW_RESTORE);
      ShowWindow(Application.MainForm.Handle, SW_NORMAL);

      SetForegroundWindow(Application.MainForm.Handle);
   end;
end;
Есть также процедура min, которая срабатывает при application.onMinimize;
Код:
procedure tForm1.min(dender: tObject);
begin
   ShowWindow(Application.Handle, SW_HIDE);
   ShowWindow(Application.MainForm.Handle, SW_HIDE);
   //sndPlaySound(pCHar(curPath+'timer.wav'), SND_ASYNC);
end;
И ещё есть procedure wmActivate(var msg: tWMActivate); message WM_ACTIVATE;:
Код:
procedure tForm1.wmActivate(var msg: tWMActivate);
begin
   ShowWindow(Application.Handle, SW_HIDE);
end;
... Всё работает здоровски...
Но есть проблема. Если нажать WIN+D (свернуть все окна) то все окна свернуться, пока все замечательно. Потом кликаем по иконке в трее.
Трабл №1: Окно появляеться не сразу, а после нескольких кликов.
Трабл №2: Если после этого кликнуть, скажем, по рабочему столу, или ещё где ни будь, окно изчезьнет.


Особенно меня бесит второй мункт. Пожалуйсто, объясните, как мне это всё организовать, или дайте исходник работающеё проги...

з.ы. Это код работает вообще не так, как надо. Я кинул его, для того, что бы был ясен принцип.
Altera вне форума Ответить с цитированием
Старый 15.08.2008, 11:07   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот порывшись в Делфи Ворлде нашел еще один пример:
Код:
unit EXE_FORM;

interface

uses        ShellApi,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
  ExtCtrls, ComCtrls, Buttons, AppEvnts;

type
  HDLL = tHandle;
 TNotifylconData = record
 cbSize: DWORD;
 Wnd: HWND;
 uID: UINT;
 uFlags: UINT;
 uCallbackMessage: UINT;
 hlcon: HICON;
 szTip: array [0..5000] of AnsiChar;
end;
  tAtomikMessage = record
     p1, p2, p3, p4: word;
  end;

  tformStatus = (fsActive, fsInVisible, fsInActive);

  TEXE_FORM1 = class(TForm)
    Button1: TButton;
    SpeedButton1: TSpeedButton;
    ListBox1: TListBox;
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure WMICON(var msg: TMessage); message  WM_USER + 123;
    procedure RestoreMainForm;    
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var             nidata:TNotifylconData;
  EXE_FORM1: TEXE_FORM1;
  dllHandle: HDLL;
  curPath: string;
  formStatus: tFormStatus = fsActive;
implementation

  {$R *.dfm}

 procedure TEXE_FORM1.RestoreMainForm;
var
  i, j: Integer;
begin
  Application.ShowMainForm := True;
  ShowWindow(Application.Handle, SW_RESTORE);
  ShowWindow(Application.MainForm.Handle, SW_RESTORE);
  begin
    for I := 0 to Application.MainForm.ComponentCount - 1 do
      if Application.MainForm.Components[I] is TWinControl then
        with Application.MainForm.Components[I] as TWinControl do
          if Visible then
          begin
            ShowWindow(Handle, SW_SHOWDEFAULT);
            for J := 0 to ComponentCount - 1 do
              if Components[J] is TWinControl then
                ShowWindow((Components[J] as TWinControl).Handle,
                  SW_SHOWDEFAULT);
          end;
  end;

end;

procedure TEXE_FORM1.WMICON(var msg: TMessage);
var P : TPoint;
begin
 case msg.LParam of
 WM_LBUTTONUP:
  begin
   RestoreMainForm;
  end;
 WM_LBUTTONDBLCLK :;// RestoreItemClick(Self);
 end;
end;

procedure TEXE_FORM1.SpeedButton1Click(Sender: TObject);
begin
   if speedButton1.Down then
   formStyle := fsStayOnTop else
   formStyle := fsNormal;
end;

procedure{ Создание формы }TEXE_FORM1.FormCreate(Sender: TObject);
begin

with nidata do
begin
 cbSize := SizeOf(TNotifylconData) ;
 Wnd := Self.Handle;
 uID := 1;
 uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
 uCallBackMessage := WM_USER + 123;
 hlcon  := Application.Icon.Handle;
 szTip :='asdsadasd'#13'dasdasdas';
end;
Shell_NotifyIcon(NIM_ADD, @nidata);
   curPath := extractFilePath(application.ExeName);
end;
end.
Это с твоего кода что ты мне скидывал
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.08.2008, 13:44   #3
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Это не подходит...
Altera вне форума Ответить с цитированием
Старый 15.08.2008, 15:33   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Попробовал свои проекты, где обрабатывается Minimize и прячется в трей, по Win+D происходит обычное сворачивание, т.е. оно не обрабатывается программой.
Никогда этого раньше не замечал т.к. никогда не пользуюсь этой комбинацией. Но ничего другого необычного не замечал, просто сворачивается. Если обработать событие сворачивания "со стороны" то думаю вообще все замечательно будет.

Код сворачивания в трей самый обычный, на WinAPI, в сети полно статей.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 15.08.2008, 15:55   #5
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Вот, когда-то делал:
Код:
..................................................................................................
var no :TNotifyIconData;
..................................................................................................
  public
    { Public declarations }
    procedure WMICON(var msg: TMessage); message WM_MYICONNOTIFY;
    procedure WMSYSCOMMAND(var msg: TMessage); message WM_SYSCOMMAND;
  end;
..................................................................................................
procedure TForm1.WMSYSCOMMAND(var msg: TMessage);
begin
  inherited; 
  if (Msg.wParam = SC_MINIMIZE) then
   begin
     CreaTray(0);
     HidWin;
   end
    ELSE
   DelTray;
end;
..................................................................................................
Procedure TForm1.CreaTray(Ic :LongInt=0);
begin 
  with no do
  begin
    cbSize:=Sizeof(TNotifyIconData);
    Wnd:=Self.Handle;
    uID:=0;
    UFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
   StrPCopy(SzTip, '======= ');
    HIcon:=ExtractIcon(Self.Handle, PChar(ParamStr(0)) ,Ic);
    uCallBackMessage:=WM_MYICONNOTIFY;
  end;
  Shell_NotifyIcon(NIM_ADD,@no);
end;

Procedure TForm1.DelTray;
begin
  with no do
  begin
    cbSize:=Sizeof(TNotifyIconData);
    Wnd:=Handle;
    uID:=0;
  end;
  Shell_NotifyIcon(NIM_Delete,@no);
end;

Procedure TForm1.HidWin;
begin  
  Application.ShowMainForm:=False;
  ShowWindow(Application.Handle, SW_HIDE);
  ShowWindow(Application.MainForm.Handle, SW_HIDE);
end;

Procedure TForm1.ShowWin;
begin  
  Application.ShowMainForm:=True;
  ShowWindow(Application.Handle, SW_RESTORE);
  ShowWindow(Application.MainForm.Handle, SW_RESTORE);
end;

procedure TForm1.WMICON(var msg: TMessage);
var     //Обработка мыши
  P: TPoint;
begin
  case msg.LParam of 
    WM_RBUTTONUP:
      begin
        GetCursorPos(p);
        SetForegroundWindow(Application.MainForm.Handle);
        PopupMenu2.Popup(P.X, P.Y);
      end;
    WM_LBUTTONDBLCLK: begin 
                    ShowWin;
                    DelTray;  
                      end;
  end;
end;
Alter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблемы с поиском vIRTx Паскаль, Turbo Pascal, PascalABC.NET 11 12.06.2008 17:43
Проблемы с Mozilla KsanDra JavaScript, Ajax 1 29.10.2007 11:44
Проблемы с DLL Дмитрий2006 Общие вопросы C/C++ 5 15.10.2007 12:43
Проблемы с FPC Акашаев Нурлан Паскаль, Turbo Pascal, PascalABC.NET 1 10.07.2007 17:09
проблемы с INI delphi Общие вопросы Delphi 4 10.04.2007 00:28