Prog in die SYStray verbannen?

  • Themenstarter Themenstarter antcool
  • Beginndatum Beginndatum
A

antcool

Guest
Kann mir jemand sagen wie man sein Prog in die SYStray verbannt?



So neben bei:
Ich dachte garnicht wie einfach es ist mit delphi ein Prog zuschreiben was aus **** den Text Zeig!!
Leider ist mir mein Programmcode abhanden gekommen aber ich werde ihn noch posten!!
 
Tach antcool,

Da Du im 'So neben bei' Delphi erwähntest suchst Du bestimmt für Delphi ne Lösung?
Leider kann ich Dir nur Beispiele in C/C++ geben, sollte aber einfach auf Delphi zu portieren sein.


Die Library Shell32.dll stellt eine Funktion namens Shell_NotifyIcon zur Verfügung (Ordinal-Nr der Fn ist 0x148), diese Fn ist der Dreh- und Angelpunkt für die Taskarea. Kann z.B. mit GetProcAdress dynamisch gebunden werden (hoffe mal auch unter Delphi).
Wenn die 0x0148 nicht funzt mußt Du mal 0x0149 (für SingleByte-ASCII) oder 0x014a (Widechar Unicode) austesten.

Diese Fn erhält neben einer Message-ID (dwMessage) noch nen Zeiger auf ne Struktur vom Typ NOTIFYICONDATA (lpData):
Code:
BOOL Shell_NotifyIcon( DWORD dwMessage, NOTIFYICONDATA *lpData );

Die Message-ID (dwMessage) gibt die auszuführende Aktion an:
  • NIM_ADD (0x0000) fügt ein neues Icon/Programm zur Taskbar hinzu.
  • NIM_DELETE (0x0002) löscht ein vorher angelegtes Icon.
  • NIM_MODIFY (0x0001) ändert ein bestehendes Icon.

und der Pointer auf die Struktur NOTIFYICONDATA hält die (je nach Aktion) benötigten Daten:
Code:
typedef struct _NOTIFYICONDATA { 
    DWORD cbSize; 
    HWND hWnd; 
    UINT uID; 
    UINT uFlags; 
    UINT uCallbackMessage; 
    HICON hIcon; 
    #if (_WIN32_IE < 0x0500)
        TCHAR szTip[64];
    #else
        TCHAR szTip[128];
    #endif
    #if (_WIN32_IE >= 0x0500)
        DWORD dwState; 
        DWORD dwStateMask; 
        TCHAR szInfo[256]; 
        union {
            UINT  uTimeout; 
            UINT  uVersion; 
        } DUMMYUNIONNAME;
        TCHAR szInfoTitle[64]; 
        DWORD dwInfoFlags; 
    #endif
    #if (_WIN32_IE >= 0x600)
        GUID guidItem;
    #endif
} NOTIFYICONDATA, *PNOTIFYICONDATA;

Für Flags können folgende Werte kombiniert werden
  • NIF_ICON (0x0002) gibt an ob der Member hIcon gültig ist.
  • NIF_MESSAGE (0x0001) gibt an ob Member uCallbackMessage gültig ist.
  • NIF_TIP (0x0004) gibt an ob Member szTip gültig ist.
Die Member cbSize, hWnd, uID und uFlags müssen immer gefüllt werden.


Hier mal ein Ausschnitt in C++ aus einer meiner Anwendungen:
Code:
// Initialisieren des Trayicons
void InitTrayIcon()
{
	NOTIFYICONDATA tnid;  
	
	UINT nIcon;
	CString szTT;
	if( _theOptions.m_bActive )
	{
		szTT = \"Application is active\";
		nIcon = IDI_ACTIVE;
	}
	else
	{
		szTT = \"Application is inactive\";
		nIcon = IDI_INACTIVE;
	}

	tnid.cbSize = sizeof( NOTIFYICONDATA );	// Größe der Struktur 
   						tnid.hWnd = _ptheMainDlg->m_hWnd; // HWND des Hauptfensters
	tnid.uID = TRAYICON_ID; // ID des Trayicons (eindeutig)
	tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // Flags
	tnid.uCallbackMessage = TRAYICON_MSG; // Win-Message als Callback
	tnid.hIcon	= LoadIcon( AfxGetResourceHandle(), MAKEINTRESOURCE( nIcon ) ); // Icon laden
	lstrcpyn( tnid.szTip, szTT, sizeof( tnid.szTip ) ); // Tooltip-Text setzen

	Shell_NotifyIcon( NIM_ADD, &tnid );// Icon erzeugen

	if ( tnid.hIcon ) // Icon zerstören, Shell_NotifyIcon 
        DestroyIcon( tnid.hIcon );// hat sich ne Kopie gemacht
}

// Löschen des Trayicons
void DestroyTrayIcon()
{
	NOTIFYICONDATA tnid;  
 
	tnid.cbSize = sizeof( NOTIFYICONDATA );	// Größe der Struktur 
    											// (wichtig für interne Versionsermittlung)
	tnid.hWnd = _ptheMainDlg->m_hWnd; // Hauptfenster, wie beim Anlegen
	tnid.uID = TRAYICON_ID; // ID wie beim Anlegen
	tnid.uFlags = 0; // Keine Flags nötig
         
	Shell_NotifyIcon( NIM_DELETE, &tnid ); // Icon löschen
}

// Modifizieren des Icons (z.B. Tooltip-Text oder Icon ändern)
void ModifyTrayIcon()
{ 
	NOTIFYICONDATA tnid;  
	CString szTT;
	UINT nIcon;

	if( _theOptions.m_bActive )
	{
		szTT = \"Application is active\";
		nIcon = IDI_ACTIVE;
	}
	else
	{
		szTT = \"Application is inactive\";
		nIcon = IDI_INACTIVE;
	}

	tnid.cbSize = sizeof( NOTIFYICONDATA ); // Größe der Struktur 
						tnid.hWnd = _ptheMainDlg->m_hWnd; // Hauptfenster, wie beim Anlegen
	tnid.uID = TRAYICON_ID; // ID, wie beim anlegen
	tnid.uFlags = NIF_TIP | NIF_ICON; // Flags
	tnid.hIcon = LoadIcon( AfxGetResourceHandle(), MAKEINTRESOURCE( nIcon ) ); // Neues Icon
	lstrcpyn( tnid.szTip, szTT, sizeof( tnid.szTip ) ); // Neuer Tooltip-Text

	Shell_NotifyIcon( NIM_MODIFY, &tnid ); // Icon ändern

	if ( tnid.hIcon ) // Icon zerstören, Shell_NotifyIcon 
        DestroyIcon( tnid.hIcon ); // hat sich ne Kopie gemacht
}


Wenn was unklar sein sollte, frag ruhig.
 
auszug aus meinen kryptoproggi

so hier mal für delphi in 7 schritten. wenn du es so eingibst, haste diesselben features wie bei meinem kryptoproggi!


1.
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, StdCtrls, Buttons, ExtCtrls, DBCtrls, Gauges, Grids, FileCtrl, ShellApi,
ComCtrls;

2.
procedure WndProc(var Msg: TMessage); override;

3.
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;

4.
private
{ Private-Deklarationen }
IconData: TNotifyIconData;

5.
procedure TfrmMain.FormShow(Sender: TObject);
var Owner: hWnd;
begin
Owner := GetWindow(Handle, GW_OWNER);
ShowWindow(Owner, SW_HIDE);
end;

6.
procedure TfrmMain.WMSysCommand(var Message: TWMSysCommand);
begin
if Message.CmdType AND $FFF0 = SC_MINIMIZE then
Hide
else
inherited;
end;

7.
procedure TfrmMain.WndProc(var Msg: TMessage);
var
Point: TPoint;
var Owner: hWnd;
begin
if Msg.Msg = WM_USER + 20 then begin
case Msg.lParam of
WM_RBUTTONDOWN: begin
GetCursorPos(Point);
//PopUpMenu.PopUp(Point.X, Point.Y);
end;
WM_LBUTTONDOWN: begin
Owner := GetWindow(Handle, GW_OWNER);
ShowWindow(Owner, SW_NORMAL);
ShowWindow(Owner, SW_HIDE);
frmmain.show ;
application.BringToFront;
end;
end;
end;
inherited;
end;
 
1. alle c++ winapi funktionen laufen auch unter delphi. (die helpfiles sind auch dabei!)

2. hier zeigt sich einmal wieder der unterschied zwischen delphi und c++. wenn es um standard windows programme geht, ist delphi unschlagbar!
 
Cool Tec,

ich habe es aus probiert und es hat gefunktz!

@all:DANKE!!!!!!
 
Original von blueflash
2. hier zeigt sich einmal wieder der unterschied zwischen delphi und c++. wenn es um standard windows programme geht, ist delphi unschlagbar!
Da ich Delphi und seine Windows-Fähigkeiten nicht kenne (kenn nur TP) muß ich es Dir wohl ungesehen glauben ;)

- Bit'chen
 
Minimieren Button...

Hallo Leute,

ich bin über die Suche auf diesen Thread gestoßen und dachte bevor ich nen neuen aufmach...

Prog in Tray schicken geht laut oben genannter Anleitung einwandfrei, nun würd ich das aber gern über den "Minimieren" Button in der Titelleiste bewerkstelligen...
sprich, statt zu minimieren gleich in die Systray schicken.
Ich hab ne MFC basierte Dialoganwendung.

Wie stell ich das an?

Ja gut, ich hab ein bischen gegoogelt und bin dann auf diese Lösung gestoßen, eigentlich trivial, wenn man weiß wies geht.
Code:
void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{      
 if (nID == SC_MINIMIZE)       
{          
 OnTray(IDR_MAINFRAME,"ZipIt");
}
else
{
           if ((nID & 0xFFF0) == IDM_ABOUTBOX)
           {
               CAboutDlg dlgAbout;
               dlgAbout.DoModal();
           }
           else
           {
               CTrayDlg::OnSysCommand(nID, lParam);
           }
       } 
}

Ich hab mir die Frage somit selbst beantwortet, aber vielleicht wird sich der eine oder andere auch gefragt haben wie das geht.

Gruß
Shane
 
Zurück
Oben