Dienst-Programmierung mit ner MessageBox?



  • Im endeffeckt habe ich es umgeschrieben, es läuft nun im Hintergrund.
    Nur was halt schlecht ist: Zum Beenden muss man im TaskManager rumpfuschen, und da manche Leute 2 linke Hände haben...

    Naja als Dienst müsste man ja auch Adminrechte haben um ihn zu Terminieren.
    Danke eurer Hilfe.



  • Wie man muss den Taskmanager bemühen um dein Programm zu beenden?
    Das ist nicht gerade die feine englische Art den User darum zu bitten das Programm abzuschiessen wenn er es beenden will.



  • Tja, was währe denn ein anderer Weg, dass Programm (wen es hidden ist) zu beenden? Ohne Dienst geht dass ja nicht.

    Naja schon mit Tastenkürzeln, aber wenn ich anfange Systemweit die Tastatur abzuhören werde ich als Trojaner/Virus 'entlarvt' oder 'beschimpft' und gelöscht.



  • Du könntest ein kleines Icon neben der Systemuhr platzieren, bei einem Doppelklick beendet es sich; alternativ sogar ein Menü einbauen 🙂



  • Ja. Jetzt kommt die weltbewegende Frage: "Wie mache ich dass?".
    Ich meine den Icon erstellen, OK.
    Nur ihn dann wieder zu Killn!? Er ist immer noch da, dass programm schon aus.

    Ausserdem, er bringt nicht viel oder?
    Er ist da, und wenn man draufklickt... nichts.
    Wie bekomme ich OnClick Evenets hin?



  • lippoliv schrieb:

    Ja. Jetzt kommt die weltbewegende Frage: "Wie mache ich dass?".
    Ich meine den Icon erstellen, OK.
    Nur ihn dann wieder zu Killn!? Er ist immer noch da, dass programm schon aus.

    Ausserdem, er bringt nicht viel oder?
    Er ist da, und wenn man draufklickt... nichts.
    Wie bekomme ich OnClick Evenets hin?

    Sag mal seit wann programmierst du und was willst du eigentlich?
    Kennst du dich überhaupt schon ein wenig mit der WinApi aus oder machst du das jetzt weil du hierhin verschoben wurdest? Falls du dich noch garnicht auskennst (so wie es scheint!) dann würde ich erstmal versuchen ein normales fenster mit ein paar buttons usw. zu erstellen.
    Ansonsten brauchst du z.B. Shell_NotifyIcon und dazu steht alles in der MSDN drin.

    schirrmie



  • Ich Programmiere C seit 3 Monaten. Ich habe noch nie was mit der API gemacht.
    Ich hatte gestern irgendwie nicht viel zu dieser Funktion "Shell_NotifyIcon" gefunden. Werd aber nochmal schauen.

    Danke für die Hilfe.

    Will mir wer sagen wo ich bei msdn einstellen kann, dass ich C programmiere und nicht C#, C++, Java, Basic oder sonstige andere Sprachen?
    Ich finde da viel für Visual Basic, aber für C find ich da wenig...

    [edit] MSDN hat irgendwie keine Funktino zum intern suchen oder? Habe gerade über 3 Umwege, angefangen bei einer Googlesuche -> MSDN: The Taskbar -> MSDN: Shell_NotifyIcon.
    Komisch.. Naja jetzt kann ich ersmtal lesen.



  • Es tut mir jetzt leid, aber eine sache (will) ich einwach nicht verstehen:

    bool SysTray_IconOpts( HWND hWnd, bool add )
    {
    	int ret;
    
    	ret = 0;
    
    	if( 1 == add )
    	{
    		/*Nötigkeitsdaten für die Tray Option.								*/
    	    NOTIFYICONDATA    nid; 
    
    		char *ballonText = "This is NaDiA. Its the 'net send' commando for Vista",
    			 *ballonTitle = "NachrichtenDienstApplikation(NaDiA)";
    
    	    memset(&nid, 0, sizeof(nid)); 
    	    nid.cbSize = sizeof(nid);
    		/*Das Fenster, zu dem der Tray-Eintrag gehört.							*/
    	    nid.hWnd = hWnd;
    		/*Die Tray_ID, damit sie später gelöscht werden kann.						*/
    	    nid.uID = 1;
    		/*Das icon dess Tray-Eintrages.									*/
    		nid.hIcon = NULL; 
    
    		nid.uCallbackMessage = MYWM_NOTIFYICON;
    		/*Was alles möglich sein soll, momentan  nur der Icon und das Draufklicken.		*/
    		nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    	    ret = Shell_NotifyIcon(NIM_ADD, &nid);
    	}
    	else
    	{
    		/*Nötigkeitsdaten für die Tray Option.								*/
    	    NOTIFYICONDATA    nid;
    	    memset(&nid, 0, sizeof(nid)); 
    	    nid.cbSize = sizeof(nid);
    		/*Das Fenster, zu dem der Tray-Eintrag gehört.							*/
    	    nid.hWnd = hWnd;
    		/*Die Tray_ID, damit sie später gelöscht werden kann.						*/
    	    nid.uID = 1;
    	    ret = Shell_NotifyIcon(NIM_DELETE, &nid);
    	}
    
    	return ret;
    }
    

    So habe ich den code aus MSDN kommentiert.
    Dass manche Kommentare nicht ganz übereinstimmen, z.B. dassvon uFlags liegt daran, dass ich gerade überlege wo meine Funktion

    void On_MYWM_NOTIFYICON( WPARAM wParam, LPARAM lParam )
    {
    	UINT uID; 
        UINT uMouseMsg; 
    
    	/*Die Gesendete Message.											*/
        uID = (UINT) wParam;
    	/*Die gedrückte Maustaste.											*/
        uMouseMsg = (UINT) lParam;
    
    	if( WM_LBUTTONDOWN == uMouseMsg )
    	{
    		printf( "hi" );
    	}
    	else
    		printf( "hi2" );
    }
    

    Aufgerufen wird.
    Die Funktionsnamen stimmen mit MSDN überein, und irgendwie geht dass nicht:

    nid.uCallbackMessage = WM_NOTIFYICON;
    

    Dieser abschnitt (uCallbackMessage) ist wohl sowas wie 'OnClick' wenn ich dass richtig verstanden habe.
    Nur erkennt mein Compiler/Linker what ever, das nicht an.

    server.c: In function `SysTray_IconOpts':
    server.c:155: error: `MYWM_NOTIFYICON' undeclared (first use in this function)
    server.c:155: error: (Each undeclared identifier is reported only once
    server.c:155: error: for each function it appears in.)
    

    Verstehe ich ja auch, ich habe ja lediglich ne Funktion 'On_MYWM_NOTIFYICON'.
    Kann mir jemand dass erklären?



  • nid.uCallbackMessage erwartet einen Zahlenwert



  • Ja ich hatt schon öfters die Variante

    nid.uCallbackMessage = WM_USER;
    

    gelesen, dass geht ja auch, aber es passiert nichts.
    Er ruft ja die Funktion nicht auf.

    [edit]
    Brauche ich auch diese WndProc function?



  • lippoliv schrieb:

    Brauche ich auch diese WndProc function?

    Ja, genau darum dreht sich ja auch das "nid.uCallbackMessage". Eben diese Nachricht bekommst du dann bei Events zugeschickt 😉



  • Danke. Werds mal versuchen, wenn ich dann mal wieder Zeit habe.
    Spätestens im Januar.



  • Hey nochmal,
    ich bleibe beim Dienst,

    aber wie es aussieht, ist es wohl UNMÖGLICH aus einem Dienst ein Fenster anzuzeigen,
    selbst wenn man über CreateProcess einen neuen Prozess erstellt oder wie sehe ich dass?



  • Hättest du dich nur ein wenig mit der Materie beschäftigt, wüsstest du dass es unter Vista keine interaktiven Dienste mehr gibt. MB_SERVICE_NOTIFICATION als Flag für die Messagebox noch funktioniert, musst du mal probieren.



  • Wie oft habe ich diesen Satz schon gehört, verstanden und trotzdem im Hintergedanken gehabt "Es währe schwachsinn wenn es eine 0%ige Chance gäbe"...

    Dienste währen dann sowas von wenig wert...

    Ja es kann sein wass ich was falsch gemacht habe aber die Zeile:

    MessageBoxEx( NULL, buf, titel, MB_SERVICE_NOTIFICATION, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) );

    oder

    MessageBox( NULL, buf, titel, MB_SERVICE_NOTIFICATION );

    gingen LEIDER beide nciht...

    Bitte sag mir einfach ich habe einen Fehler eingebaut... 😞

    Ich bin SOOO knapp am verzweifeln...



  • lippoliv schrieb:

    "Es währe schwachsinn wenn es eine 0%ige Chance gäbe"

    die "chance" ist ja auch nicht 0%. du hast ja immerhin die möglichkeit dein eigenes betriebssystem mit "interaktiven diensten" zu schreiben...

    lippoliv schrieb:

    Dienste währen dann sowas von wenig wert...

    nein, dieser satz zeigt, dass du besagten anderen satz doch nicht verstanden hast.

    ein dienst ist nicht dazu gedacht interaktiv zu sein. wenn du interaktivität willst, dann mach ein normales programm und keinen dienst. period.



  • Was ist der Unterschied zwischen einem Dienst und einem Programm?

    Der Dienst ist lediglich in der Computerverwaltung + dem Passenden Register im Task manager.

    Ausserdem soll der Dienst ja ncihts anzeigen.

    Der Dienst startet ja inzwischen eine *.exe Datei, diese soll dann ein Fenster anzeigen.

    Ahso und deine Bemerkung

    dot schrieb:

    die "chance" ist ja auch nicht 0%. du hast ja immerhin die möglichkeit dein eigenes betriebssystem mit "interaktiven diensten" zu schreiben...

    (Ich könnte auch einfach XP nemen,)
    die %te der Möglichkeit sind -wie jeder verstehen sollte- an Vista ausgelegt....

    OMG wenn ich es nichtmal hinkriege nen Service zu programmieren ohne nen Forum zu benutzen, werde ich kein Betriebssystem schreiben oder? 🤡



  • lippoliv schrieb:

    Was ist der Unterschied zwischen einem Dienst und einem Programm?

    genau das is das problem. ein dienst z.b. läuft immer, ein programm nur wenn ein user eingeloggt ist. das nur als beispiel.

    wenn du erst seit einigen monaten mit C programmierst und von WinAPI keine ahnung hast, warum willst du dann unbedingt einen dienst schreiben, obwohl dir doch jeder mit ahnung hier schon mehrmals gesagt hat, dass das schwachsinn ist!?
    dienste und normale anwendungen sind zwei verschiedene paar schuhe und letztere sicher angenehmer zu tragen 😉

    lippoliv schrieb:

    Der Dienst ist lediglich in der Computerverwaltung + dem Passenden Register im Task manager.

    das is aber nur der schein an der oberfläche. das bedeutet nicht dass man einen dienst nimmt, wenn man diesen "effekt" erzielen will.
    um genau zu sein stimmt das so gar nicht, weil du im task manager eigentlich nur den prozess der einen bestimmten dienst enthält zu gesicht bekommst. den dienst selber siehst du dort nicht.

    lippoliv schrieb:

    Der Dienst startet ja inzwischen eine *.exe Datei, diese soll dann ein Fenster anzeigen.

    und warum muss unbedingt ein dienst eine exe starten!?
    soweit ich mich erinnern kann gings doch nur darum ein programm "im hintergrund" laufen zu lassen!? warum machst du nicht einfach ein normales programm, z.b. mit einem tray icon und einem eintrag im autostart, wie es quasi standard für derlei programme ist und wie es auch schon mehrfach vorgeschlagen wurde!?

    lippoliv schrieb:

    Ahso und deine Bemerkung

    dot schrieb:

    die "chance" ist ja auch nicht 0%. du hast ja immerhin die möglichkeit dein eigenes betriebssystem mit "interaktiven diensten" zu schreiben...

    (Ich könnte auch einfach XP nemen,)
    die %te der Möglichkeit sind -wie jeder verstehen sollte- an Vista ausgelegt....

    dass es unter xp möglich is bedeutet net, dass es a) einfach so möglich is und b) sinnvoll is.

    lippoliv schrieb:

    OMG wenn ich es nichtmal hinkriege nen Service zu programmieren ohne nen Forum zu benutzen, werde ich kein Betriebssystem schreiben oder? 🤡

    richtig. aber wenn du erst anfänger in sachen c und winapi bist, warum dann willst du dann gleich einen dienst programmieren!?
    das is ungefähr gleich absurd...



  • lippoliv schrieb:

    Was ist der Unterschied zwischen einem Dienst und einem Programm?

    ^^ rethorisch, wird gliech darunter selbst von mir erklärt, natürlich weiss ich schon dass es auch in der "Startmethode" unterschiedlich ist...

    dot schrieb:

    richtig. aber wenn du erst anfänger in sachen c und winapi bist, warum dann willst du dann gleich einen dienst programmieren!?
    das is ungefähr gleich absurd...

    erklärst du schon selbst:

    dot schrieb:

    soweit ich mich erinnern kann gings doch nur darum ein programm "im hintergrund" laufen zu lassen!? warum machst du nicht einfach ein normales programm, z.b. mit einem tray icon und einem eintrag im autostart,[...]

    Genau dass ist der Knackpunkt, dass bekomme ich evtl auch hin, aber da wird es schon gegen meine vorstellung:
    es ist sichtbar... 😞

    Es soll ja komplett unsichtbar sein.
    Natürlich, der User muss es erst auf "Autostart" setzen oder so, also er weiss schon, dass dieses Programm auf seinem Computer ist, aber wenn es im Tray ist... da sind meiner meinung nach schon x-1000 andere Programme oder?

    Klar es ist für mich echt nicht einfach, die WinAPI zu verstehen, oder damit umzgehen, aber dass heißt ja nicht, dass ich es nicht versuchen werde.
    Warum ich dass jetzt schon machen will?

    Ich werde nicht meine ganze Ausbildung lang in C programmieren, sonder evtl. in 1 - 2 Monaten mit Java beginnen, wass ich dann wohl eine ganze weile machen werde.
    Und wenn dass beginnt, werde ich keine Zeit mehr haben für C... 😉

    PS: Ich werde jetzt nochmal einen anlauf für den Tray versuchen, aber eins ist sicher: es wird nicht so geil, wie wenns ein Dienst währe.



  • lippoliv schrieb:

    Der Dienst startet ja inzwischen eine *.exe Datei, diese soll dann ein Fenster anzeigen.

    Ich wiederhole mich. Du solltest dich mal mit dem Thema beschäftigen. Dienste laufen in einer anderen WindowsStation. Wenn ein Dienst ein Programm startet, dass der Benutzer sehen können soll, muss der Dienst dieses Programm in der interaktiven WindowsStation des Benutzers und auf dessen (default) Desktop starten.

    lippoliv schrieb:

    aber da wird es schon gegen meine vorstellung:
    es ist sichtbar... 😞

    Und was ist dagegen einzuwenden, wenn der Benutzer sieht, dass er ein Chatprogramm laufen hat?


Anmelden zum Antworten