Subversion Repositories delphiutils

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. unit Main;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ComCtrls, ShellAPI, Menus;
  8.  
  9. const
  10.   WM_TASKABAREVENT = WM_USER+1; //Taskbar message
  11.  
  12. type
  13.   TMainForm = class(TForm)
  14.     PopupMenu1: TPopupMenu;
  15.     Anzeigen1: TMenuItem;
  16.     Beenden1: TMenuItem;
  17.     procedure FormDestroy(Sender: TObject);
  18.     procedure FormCreate(Sender: TObject);
  19.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  20.     procedure Anzeigen1Click(Sender: TObject);
  21.     procedure Beenden1Click(Sender: TObject);
  22.   private
  23.     RealClose: boolean;
  24.     procedure TaskbarEvent(var Msg: TMessage);
  25.       Message WM_TASKABAREVENT;
  26.     procedure OnQueryEndSession(var Msg: TWMQueryEndSession);
  27.       message WM_QUERYENDSESSION ;
  28.     procedure NotifyIconChange(dwMessage: Cardinal);
  29.   protected
  30.     cal: TMonthCalendar;
  31.   public
  32.     procedure Vordergrund;
  33.   end;
  34.  
  35. var
  36.   MainForm: TMainForm;
  37.  
  38. implementation
  39.  
  40. {$R *.dfm}
  41.  
  42. uses
  43.   CommCtrl, FullYearCalendar;
  44.  
  45. // Ref: http://www.delphi-fundgrube.de/faq01.htm
  46.  
  47. procedure TMainForm.TaskbarEvent(var Msg: TMessage);
  48. var
  49.   Point: TPoint;
  50. begin
  51.  
  52.   { Die WM_TaskbarEvent-Message "Msg" gibt in Msg.LParam
  53.     das genaue Ereignis an. Msg.LParam kann folgende Werte für
  54.     Mausereignisse annehmen:
  55.  
  56.     WM_MouseMove
  57.     WM_LButtonDown
  58.     WM_LButtonUp
  59.     WM_LButtonDblClk
  60.     WM_RButtonDown
  61.     WM_RButtonUp
  62.     WM_RButtonDblClk }
  63.  
  64.   case Msg.LParam of
  65.     WM_LButtonDblClk:
  66.       begin
  67.         Vordergrund;
  68.       end;
  69.     WM_RButtonUp:
  70.       begin
  71.         // Rechtsklick
  72.         // Diese Zeile ist wichtig, damit das PopupMenu korrekt
  73.         // wieder geschlossen wird:
  74.         SetForegroundWindow(Handle);
  75.         // PopupMenu anzeigen:
  76.         GetCursorPos(Point);
  77.         PopupMenu1.Popup(Point.x, Point.y);
  78.         //oder ohne Variable Point:
  79.         //PopupMenu1.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
  80.       end;
  81.   end;
  82. end;
  83.  
  84. procedure TMainForm.NotifyIconChange(dwMessage: Cardinal);
  85. var
  86.   NotifyIconData: TNotifyIconData;
  87. begin
  88.   Fillchar(NotifyIconData,Sizeof(NotifyIconData),0);
  89.   NotifyIconData.cbSize := Sizeof(NotifyIconData);
  90.   NotifyIconData.Wnd    := Handle;
  91.   NotifyIconData.uFlags := NIF_MESSAGE
  92.     or NIF_ICON
  93.     or NIF_TIP;
  94.   NotifyIconData.uCallbackMessage := WM_TASKABAREVENT;
  95.   NotifyIconData.hIcon := Application.Icon.Handle;
  96.   NotifyIconData.szTip := 'Kalender';
  97.   Shell_NotifyIcon(dwMessage, @NotifyIconData);
  98. end;
  99.  
  100. procedure TMainForm.FormDestroy(Sender: TObject);
  101. begin
  102.   cal.Free;
  103.   NotifyIconChange(NIM_DELETE);
  104. end;
  105.  
  106. procedure TMainForm.FormCreate(Sender: TObject);
  107. begin
  108.   NotifyIconChange(NIM_ADD);
  109.  
  110.   cal := TFullYearCalendar.Create(Self);
  111.   cal.Parent := Self;
  112.   cal.WeekNumbers := true;
  113.  
  114.   ClientWidth := cal.Width;
  115.   ClientHeight := cal.Height;
  116. end;
  117.  
  118. // Ref: http://www.swissdelphicenter.ch/de/showcode.php?id=261
  119.  
  120. function ForceForegroundWindow(hwnd: THandle): Boolean;
  121. const
  122.   SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
  123.   SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
  124. var
  125.   ForegroundThreadID: DWORD;
  126.   ThisThreadID: DWORD;
  127.   timeout: DWORD;
  128. begin
  129.   if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);
  130.  
  131.   if GetForegroundWindow = hwnd then Result := True
  132.   else
  133.   begin
  134.     // Windows 98/2000 doesn't want to foreground a window when some other
  135.     // window has keyboard focus
  136.  
  137.     if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
  138.       ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
  139.       ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
  140.       (Win32MinorVersion > 0)))) then
  141.     begin
  142.       // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
  143.       // Converted to Delphi by Ray Lischner
  144.       // Published in The Delphi Magazine 55, page 16
  145.  
  146.       Result := False;
  147.       ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
  148.       ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
  149.       if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
  150.       begin
  151.         BringWindowToTop(hwnd); // IE 5.5 related hack
  152.         SetForegroundWindow(hwnd);
  153.         AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
  154.         Result := (GetForegroundWindow = hwnd);
  155.       end;
  156.       if not Result then
  157.       begin
  158.         // Code by Daniel P. Stasinski
  159.         SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
  160.         SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
  161.           SPIF_SENDCHANGE);
  162.         BringWindowToTop(hwnd); // IE 5.5 related hack
  163.         SetForegroundWindow(hWnd);
  164.         SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
  165.       end;
  166.     end
  167.     else
  168.     begin
  169.       BringWindowToTop(hwnd); // IE 5.5 related hack
  170.       SetForegroundWindow(hwnd);
  171.     end;
  172.  
  173.     Result := (GetForegroundWindow = hwnd);
  174.   end;
  175. end;
  176.  
  177. procedure TMainForm.Vordergrund;
  178. begin
  179.   Show;
  180.   ForceForegroundWindow(Handle);
  181. end;
  182.  
  183. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  184. begin
  185.   Hide;
  186.   CanClose := RealClose;
  187. end;
  188.  
  189. procedure TMainForm.OnQueryEndSession;
  190. begin
  191.   RealClose := true;
  192.   Close;
  193.   Msg.Result := 1;
  194. end;
  195.  
  196. procedure TMainForm.Anzeigen1Click(Sender: TObject);
  197. begin
  198.   Vordergrund;
  199. end;
  200.  
  201. procedure TMainForm.Beenden1Click(Sender: TObject);
  202. begin
  203.   RealClose := true;
  204.   Close;
  205. end;
  206.  
  207. end.
  208.