Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 18:14

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Tutorial]Dialog in den Tray minimieren + menü

Discussion on [Tutorial]Dialog in den Tray minimieren + menü within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
[Tutorial]Dialog in den Tray minimieren + menü

[Tutorial]Dialog in den Tray minimieren + menü
Ist ja schon etwas länger her, seitdem ich ein Tutorial geposted habe. Ich sage euch mal die Wahrheit, ich hatte keine Lust :P
Aber jetzt hat mich gerad wieder das Fieber gepackt und ich schreibe eins.


In diesem Tutorial werde ich euch zeigen, wie ihr euren Dialog in den Tray minimieren könnt und bei Rechtsklick ein Menü aufrufen könnt. Besonders bei Bot programmierern ist diese Technik beliebt. Und sie ist eigentlich recht Simpel.




#Inhalt:
[-]Voraussetzungen & Programme
[-]Dialog erstellen
[-]Funktion in der Header Datei
[-]Funktionen im Quelltext
[-]Menü erstellen
[-]Menü einbinden
[-]Nachwort




[-]Voraussetzungen & Programme


Voraussetzungen:
  • Kenntnisse im Umgang mit Visual Studio

Programme:
  • Visual Studio 2005 oder höher (keine Express Version)

An dieser Stelle sage ich es nochmal. Ich benutzte keine Express Version. Die Express Version ist zwar auch schön und gut wenn man Programmieren will, aber Programmiere hier mit MFC ( Microsoft Foundation Class) und die Express hat kein MFC. Ihr müsst euch also die Vollversion besorgen.



[-]Dialog erstellen


So, als Erstes erstellen wir eine neue Dialoganwendung, oder öffnen eine bestehende.
Wie das geht sollte ja nun nicht mehr das Problem sein. Ich nenne mein Projekt: DialogTray



Dann stellen wir aud Dialogbasierend und machen die ActiveX Steuerelemente weg. Außerdem solltet ihr auch die Minimieren-Schaltfläche aktivieren.



[-]Funktion in der Header Datei


So nun gehen wir in die CDialogTrayDlg.h (Die Header datei für den Hauptdialog)



Nun haben wir dort unter Protected: folgendes stehen:

PHP Code:
protected:
    
HICON m_hIcon;

    
// Generierte Funktionen für die Meldungstabellen
    
virtual BOOL OnInitDialog();
    
afx_msg void OnSysCommand(UINT nIDLPARAM lParam);
    
afx_msg void OnPaint();
    
afx_msg HCURSOR OnQueryDragIcon();
    
DECLARE_MESSAGE_MAP() 
Nun deklarieren wir unsere Funktion z.B. nach afx_msg void OnPaint();
Wir fügen also folgendes hinzu:

PHP Code:
LRESULT OnTrayNotification(WPARAM wParamLPARAM lParam); 


[-]Funktionen im Quelltext


So nun müssen wir unsere Funktionen hinzufügen. Auch wenn es etwas kompliziert aussieht, ist es das nicht.

Wir gehen in die DialogTrayDlg.cpp und fügen nach den Includes folgendes ein:

PHP Code:
#define WM_NOTIFICATION (WM_APP+100) 
Dann scrollen wir etwas weiter runter.
Irgendwann sollen wir folgendes sehen:

PHP Code:
BEGIN_MESSAGE_MAP(CDialogTrayDlgCDialog)
    
ON_WM_SYSCOMMAND()
    
ON_WM_PAINT()
    
ON_WM_QUERYDRAGICON()
    
//}}AFX_MSG_MAP
END_MESSAGE_MAP() 
(Das sollte eigentlich direkt über der Funktion OnIntitDialog sein. Also leicht zu finden)

Nach dem ON_WM_SYSCOMMAND() fügen wir folgendes ein:
PHP Code:
   ON_MESSAGE(WM_NOTIFICATIONOnTrayNotification
So nun scrollen wir noch ein Stück nach unten, bis wir folgende Funktion sehen:

PHP Code:
void CDialogTrayDlg::OnSysCommand(UINT nIDLPARAM lParam)
{
    if ((
nID 0xFFF0) == IDM_ABOUTBOX)
    {
        
CAboutDlg dlgAbout;
        
dlgAbout.DoModal();
    }
    else
    {
        
CDialog::OnSysCommand(nIDlParam);
    }

Und in die ELSE Anweisung schreiben wir folgendes:

PHP Code:
switch( nID){
         case 
SC_MINIMIZE:   {
                           
ShowWindow(SW_HIDE);
                           
NOTIFYICONDATA tnd;
                           
ZeroMemory(&tndsizeof (NOTIFYICONDATA));
                           
tnd.cbSize sizeof (NOTIFYICONDATA);
                           
tnd.hWnd m_hWnd;
                           
tnd.uID 1;
                           
tnd.uFlags NIF_MESSAGE|NIF_ICON|NIF_TIP;
                           
tnd.uCallbackMessage WM_NOTIFICATION;
                           
tnd.hIcon = (HICONLoadImage(AfxGetApp()->m_hInstanceMAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON16,16,LR_SHARED|LR_DEFAULTCOLOR);
                           
wcscpytnd.szTip_T("Mein Dialog"));
                           
Shell_NotifyIcon(NIM_ADD,&tnd);
                        }break;

         default:         
CDialog::OnSysCommand(nIDlParam); } 
So und wir scollen wieder etwas weiter runter. Nach der folgenden Funktion:
PHP Code:
HCURSOR CDialogTrayDlg::OnQueryDragIcon()
{
    return 
static_cast<HCURSOR>(m_hIcon);

Fügen wir unsere Funktion ein, die wir auch in der Header deklariert haben.

PHP Code:
LRESULT CDialogTrayDlg::OnTrayNotification(WPARAM wpLPARAM lp)
{
    switch (
lp){
      case 
WM_LBUTTONUP:   ShowWindow(SW_SHOW);
                     
NOTIFYICONDATA iconData;
                     
iconData.cbSize sizeof(NOTIFYICONDATA);
                     
iconData.hWnd this->GetSafeHwnd();
                     
iconData.uID 1;
                     return 
Shell_NotifyIcon(NIM_DELETE,&iconData);
    }
   return 
0;

Und ihr seid Fertig. Kompeliert das Projekt und wenn der Dialog offen ist, minimiert ihn. Dann sollte nur das das Icon im Tray zu sehen sein. Wenn ihr nun einen Linksklick da drauf macht, kommt der Dialog wieder hoch.


[-]Menü erstellen


So, natürlich wäre es super, wenn man den Bot , Hack oder jedes andere Programm was ihr habt, und es im Tray minimiert habt, von dort aus auch steuern könntet.

Also erstellen wir uns ein Menü. Wir gehen in die Ressourcenansicht und machen dort einen Rechtsklick und gehen auf "Ressource hinzufügen".


Und dort wählen wir Menü und klicken auf Neu.



Dann klicken wir auf unser Menü und dort wo "Hier eingeben" steht geben wir unsere Menüpunkte ein. Das erste ist wie man es von Menüs kennt, die Überschrift. Die datrunter die Menüeinträge für Funktionen.






[-]Menü einbinden


Jetzt müssen wir unser Menü noch einbinden.
Dafür gehen wir wieder in unsere DialogTrayDlg.h

Nach den ganzen Protected sachen, schreiben wir :
PHP Code:
public:
CMenu m_TrayMenu
Damit haben wir nun ein CMenu Objekt angelegt. Und können von überall aus darauf zugreifen.



Dann gehen wir in die DialogTrayDlg.cpp und scrollen runter zu unserer

LRESULT CDialogTrayDlg::OnTrayNotification(WPARAM wp, LPARAM lp) Funktion.

Wir erinnern uns:

PHP Code:
LRESULT CDialogTrayDlg::OnTrayNotification(WPARAM wpLPARAM lp)
{
    switch (
lp){
      case 
WM_LBUTTONUP:   ShowWindow(SW_SHOW);
                     
NOTIFYICONDATA iconData;
                     
iconData.cbSize sizeof(NOTIFYICONDATA);
                     
iconData.hWnd this->GetSafeHwnd();
                     
iconData.uID 1;
                     return 
Shell_NotifyIcon(NIM_DELETE,&iconData);
    }
   return 
0;

Nun fügen wir ein case WM_RBUTTONUP hinzu. Damit wenn wir einen Rechtsklick auf das TrayIcon machen, das Menü geladen wird.

Das sieht dann so aus:

PHP Code:
case WM_RBUTTONUPCPoint pt;    
    
GetCursorPos(&pt);
    
m_TrayMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,pt.x,pt.y,this); 
So jetzt scrollen wir noch etwas hoch. Bis wir die CDialogTrayDlg::OnInitDialog() Funktion finden.

Über dem return TRUE; sollte
// TODO: Hier zusätzliche Initialisierung einfügen

Da drunter schreiben wir:
PHP Code:
m_TrayMenu.LoadMenu(IDR_MENU1); 
Somit läd das Objekt immer unser erstelltes Menü. IDR_MENU1 ist die ID. Die kann natürlich anders sein, wenn ihr die verändert habt.



Jetzt seid ihr fertig. Wenn ihr alles richtig gemacht habt, sollte wenn man auf die Minimieren Schaltfläche klickt, der Dialog in den Tray gehen. Bei Rechtsklick das Menü anzeigen und bei Linksklick wieder Maximiert werden.



[-]Nachwort


So ich hoffe es hat euch gefallen. Auch wenn es etwas kompliziert scheint, ist es doch recht einfach. Jetzt könnt ihr eure Hacks, Bots oder auch andere Programme in den Tray minimieren und von dort aus über ein Menü steuern!

Viel Spaß damit.
Adroxxx is offline  
Thanks
4 Users
Old 05/03/2009, 16:11   #2
 
elite*gold: 0
Join Date: Apr 2009
Posts: 67
Received Thanks: 83
Ich bin zwar nicht so dicke mit der Begrifflichkeit, aber sollte es nicht eher als "Howto" bezeichnet werden?
Im Grunde erklärst du ja recht wenig, sondern vielmehr gibst du Anweisungen, wodurch man ein Ergebnis erzielt, den Weg dahin aber nicht zwangsläufig versteht.
Abgesehen davon sieht der Aufbau und das Drumherum sehr schick aus.

Allerdings scheint es halt auch nach viel Aufwand für Pille-Palle zu sein, da man sich für Tray Icons nur ein wenig in die leicht herauszufindenen WinAPI Funktionen einlesen muss (hauptsächlich nur, um die richtigen Parameter zu pushen ;-)

Ist natürlich nur positive Kritik....
Ach, und wäre das Tutorial mit einer Nachrichtenschleife, die man selber abfängt, und ohne OOP nicht wesentlich hilfreicher? Wer benutzt schon MFC :P
RDTSC is offline  
Old 05/03/2009, 16:36   #3

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
Quote:
Originally Posted by RDTSC View Post
Ich bin zwar nicht so dicke mit der Begrifflichkeit, aber sollte es nicht eher als "Howto" bezeichnet werden?
Im Grunde erklärst du ja recht wenig, sondern vielmehr gibst du Anweisungen, wodurch man ein Ergebnis erzielt, den Weg dahin aber nicht zwangsläufig versteht.
Abgesehen davon sieht der Aufbau und das Drumherum sehr schick aus.
Naja Tutorial, heißt ja auch mehr oder weniger Anleitung. Frei übersetzt.
Für mich ist eigentlich HowTo auch nichts anderes als Tutorial.
Aber du hast schon recht, hier erkläre ich jetzt recht wenig. Das hat aber auch den Grund, weil wenn ich echt alles Erklären würde, was etwas macht usw. wäre das Tutorial Länger als alle meine vorherigen zusammen. Weil ich dann auf alles mögliche eingehen müsste. Weil wenn ich schon was erkläre dann richtig xD Und das wäre mir jetzt auch zu aufwendig xD

Bei einigen Sachen kann man sich das natürlich denken, was es macht. Wie z.B.
PHP Code:
wcscpytnd.szTip_T("Mein Dialog")); 
Da sieht man szTip und da wird ein String reinkopiert. Also kann man sich denken dass, das für den TrayTip ist.

Aber die Frage ist muss ich unbedingt wissen was genau
PHP Code:
tnd.uCallbackMessage WM_NOTIFICATION
macht?

Ich glaube besonders bei diesem Beispiel reicht es wenn man weiß, das man das braucht. Besonders das Minimieren in den Tray ist eine recht geradlinige Sache. Sprich man kann bzw braucht da nicht viel Modifizieren. Programm wird ausgeblendet, Icon im Tray, Bei Klick Programm eingeblendet. Ist ein fester Ablauf, daum braucht man imo nicht genau wissen wie dies zu stande kommt. Wer daran Interessiert ist, kann sich ja in der MSDN schlau darüber machen.

Quote:
Originally Posted by RDTSC View Post
Allerdings scheint es halt auch nach viel Aufwand für Pille-Palle zu sein, da man sich für Tray Icons nur ein wenig in die leicht herauszufindenen WinAPI Funktionen einlesen muss (hauptsächlich nur, um die richtigen Parameter zu pushen ;-)
Eigentlich kann ich nicht bestätigen das es "viel" Aufwand ist. Sieht vielleich etwas viel aus, aber eigentlich ist es ja nur die OnTrayNotification Funktion und die case im OnSysCommand.

Quote:
Originally Posted by RDTSC View Post
Ist natürlich nur positive Kritik....
Ach, und wäre das Tutorial mit einer Nachrichtenschleife, die man selber abfängt, und ohne OOP nicht wesentlich hilfreicher? Wer benutzt schon MFC :P
Ich benutzte MFC :P Das Problem bei besonders C++ Tutorials die mit GUI sind, die Übertragbarkeit auf andere Systeme / Libs usw.
Weil ich glaube kaum, das es viele Leute gibt, die ihre GUIs wenn sie unter C++ in Windows Programmieren per Hand, per API aufbauen. Das ist zu viel Arbeit.
Aber es gibt halt welche die vielleicht GTK, QT, oder auch andere GUIs benutzten. Für welche soll ich jetzt das Tutorial schreiben? Ich kann es zwar in pure c++ mit API schreiben, aber wenn jemand irgendeine Lib benutzt, wo es einfacher geht, wieso soll er sich dann die Arbeit machen und das mit API machen?

Deswegen habe ich für mich entschieden das ich meine Tutorials in denen es auch um Programmierung geht, in MFC mache. Der Grund ist einfach der das ich schon länger mit MFC programmiere. Auch bei meinen anderen Tutorials wie "Dialogfarbe ändern" oder das "General Gamehacking" Tutorial benutzte ich MFC. Und auch in folgenden werde ich MFC benutzten.
MFC ist zwar manchmal recht nervig, ist aber bei vielen sachen recht bequem. :P

Ich finde halt, man muss sich schon für eins entscheiden um wirklich spezifische Tutorials zu schreiben. Ich will z.B. bald ein's machen wie man Tabs bzw TabControl unter MFC benutzt. Damit man Tabs in seinem Dialog hat. Das kann ich halt nur Spezifisch machen. Unter GTK geht das wahrscheinlich anders, vll auch einfacher. Wobei ich muss zugeben, bei der Tabs geschichte, bin ich am mogeln, weil ich dort eine externe klasse benutzte, weil die mfc interne geschichte, etwas aufwendig ist.
Adroxxx is offline  
Thanks
2 Users
Old 05/03/2009, 18:02   #4
 
Gianotti's Avatar
 
elite*gold: 20
Join Date: Mar 2008
Posts: 1,455
Received Thanks: 140
great tut^^

PS: bist du anwednungsentwickler? weil du ja ne ausbildung gemacht hast dafür o0
Gianotti is offline  
Old 05/03/2009, 18:06   #5

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
Ich bin staatl. geprüfter Game Hacker!
Adroxxx is offline  
Old 05/03/2009, 21:51   #6
 
elite*gold: 0
Join Date: Apr 2009
Posts: 67
Received Thanks: 83
"mit einer Nachrichtenschleife, die man selber abfängt"
Hab' mich verschrieben :0
Natürlich sollte es "mit einer eigenen Nachrichtenschleife", "mit selber abgefangenen Nachrichten" o.ä. heißen.

Mit 'viel Aufwand für Pille-Palle' meinte ich, dass dein Tutorial nach (dafür zu viel) Mühe aussieht.

Vielleicht kannst du ja für die Unwissenden das nächste Mal z.B. die Parameter erläutern, oder bei Befehlen, die weniger transparent sind, sagen, was damit erzielt wird ;-)

[ Edit ]
Wollte eigentlich auch noch schreiben (hab's beim Verfassen des Posts dann aber wieder vergessen):
Wenn ich GUIs verwenden will, schreibe ich mir immer eine eigene Nachrichtenschleife, bleibt also alles im Rahmen der WinAPI.
Nur die Dialoge erzeuge ich nicht mit Code, sondern bette sie als Resource ein, wäre sonst zu lästig :-)
RDTSC is offline  
Old 05/03/2009, 22:01   #7

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
Quote:
Originally Posted by RDTSC View Post
"mit einer Nachrichtenschleife, die man selber abfängt"
Hab' mich verschrieben :0
Natürlich sollte es "mit einer eigenen Nachrichtenschleife", "mit selber abgefangenen Nachrichten" o.ä. heißen.

Mit 'viel Aufwand für Pille-Palle' meinte ich, dass dein Tutorial nach (dafür zu viel) Mühe aussieht.

Vielleicht kannst du ja für die Unwissenden das nächste Mal z.B. die Parameter erläutern, oder bei Befehlen, die weniger transparent sind, sagen, was damit erzielt wird ;-)

[ Edit ]
Wollte eigentlich auch noch schreiben (hab's beim Verfassen des Posts dann aber wieder vergessen):
Wenn ich GUIs verwenden will, schreibe ich mir immer eine eigene Nachrichtenschleife, bleibt also alles im Rahmen der WinAPI.
Nur die Dialoge erzeuge ich nicht mit Code, sondern bette sie als Resource ein, wäre sonst zu lästig :-)
Wenn ich ein Tutorial mache, heißt es immer viel Mühe für mich xD Brauchst dir nur die anderen mal anschauen, sind auch so lang und mit bildchen usw. Manche sogar länger ^,^

Ich werd vielleicht später...naya eher die Tage mal, das Tutorial nochmal etwas überarbeiten. Ich werd dann im Quelltext Kommentare zu den einzelnen Sachen machen. Damits im Rahmen bleibt, was den Aufwand angeht, aber man dann weiß - mehr oder weniger - wozu die sachen da sind. Werds mir auch mal für folgende Tutorials merken, etwas mehr zu erklären *g*

Ja jeder Programmiert jetzt etwas anders, wiegesagt ich mach's ja über MFC und da siehste ja wie viel das ist. Wenn man das per Hand macht, sollte das aber imo auch nicht weniger Arbeit sein

Als nächstes werd ich mal das Dialog mit Tabs Tutorial machen. Wird aber leider auch in MFC sein :P
Adroxxx is offline  
Old 05/04/2009, 20:08   #8
 
Gianotti's Avatar
 
elite*gold: 20
Join Date: Mar 2008
Posts: 1,455
Received Thanks: 140
das fänd ich auch toll XD sag mal wirste jetzt mod?o0
Gianotti is offline  
Reply


Similar Threads Similar Threads
[Tutorial] Banngefahr bei Farm-Bots minimieren
06/18/2010 - GW Guides & Templates - 47 Replies
Banngefahr beim Botten minimieren Einleitung: In diesem Tutorial werde ich versuchen dir zu erklären, wie man die Banngefahr bei Farmbots auf ein geringes Restrisiko minimieren kann. Eine Strategie wie man Banns zu 100% vermeiden kann, gibt es natürlich nicht. Wenn man jedoch einige Tipps beachtet, kann man mit einem Account über einen sehr langen Zeitraum hinweg botten. Ich persönlich benutze nun seit ~1 Jahr, mit bis zu 8 Accounts gleichzeitig, Farmbots und habe deswegen noch...
[Request] Tray UDF
05/04/2010 - AutoIt - 2 Replies
Hey, da ich weder in google noch in diversen AutoIT foren irgendetwas gefunden habe, frage ich einfach mal hier. Und zwar such ich en UDF um die TrayMenu Farbe zu changen. Eine Hab ich mal gesehen, aber funzt nicht so richtig und sieht scheise aus. Falls wer ne gute kennt bitte hier posten, danke ;) ~mfg
D2NT/D2 als Tray?
04/30/2010 - Diablo 2 - 1 Replies
Hallo, und zwar würde ich gerne wissen, ob es möglich ist, den D2NT-Manager und/oder die D2 Fenster nicht in der Taskleiste angezeigt zu bekommen, sondern sie z.B. rechts unten nur als Tray anzeigen zu lassen. Weiss jemand, ob es möglich ist bzw. wie? gruß jammy
4T Tray Minimizer
03/11/2009 - SRO Hacks, Bots, Cheats & Exploits - 8 Replies
Useful progam when we want to leave bot and other when we come down from computer. Program minimizes for tray choose by we other including programs. It is of use for me. ;] K+ plz If it will be of use for you ;] http://rapidshare.com/files/33834650/4T-mi...nimi ze.exe.html Clean :D
[Release]a tray program
03/08/2009 - CO2 PServer Guides & Releases - 6 Replies
OK i found this program today u extract the Tray.exe in your C:\ then you go to what ever u want to minimize to your tray and edit its target put "C:\Tray.exe" "........" the ........ is what was normally in the target u just add "C:\Tray.exe" in front of it with a space between it and the next target for ex... u want to minimize Conquer to your tray u go to the shortcut of conquer on your desktop u right click then click Properties its target will look like "C:\Program Files\Conquer...



All times are GMT +1. The time now is 18:15.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.