1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Tray verschwindet

  • djtraumwelt
  • 28. November 2008 um 10:35
  • Unerledigt
  • djtraumwelt
    3
    djtraumwelt
    Mitglied
    Punkte
    85
    Beiträge
    12
    • 28. November 2008 um 10:35
    • #1
    C
    [COLOR=red][COLOR=Black]#include <string.h>
    #include <windows.h>
    #include <shellapi.h>
    
    
    #define WM_SHELLNOTIFY WM_USER+5
    
    
    HINSTANCE hInst;
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    HWND glob;
    NOTIFYICONDATA nid = {0};
    HMENU hPopup;
    char winclass[] = "Lutschendes Prog";
    
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR CmdLine, int nCmdShow) {
     MSG msg;
     BOOL bRet;
     hInst=hInstance;
     HWND hWnd;
     int xwin=0;
     int ywin=0;
    
    
     WNDCLASS wc;
    
    
     wc.style = CS_HREDRAW | CS_VREDRAW;
     wc.lpfnWndProc = WndProc;
     wc.cbClsExtra = 0;
     wc.cbWndExtra = 0;
     wc.hInstance = hInstance;
     wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
     wc.hCursor = LoadCursor (NULL, IDC_ARROW);
     wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
     wc.lpszMenuName = NULL;
     wc.lpszClassName = winclass;
    
    
     RegisterClass (&wc);
    
    
     xwin=GetSystemMetrics(SM_CXSCREEN);
     ywin=GetSystemMetrics(SM_CYSCREEN);
     xwin /= 2;
     xwin -= 200; //400 Breit
     ywin /= 2;
     ywin -= 50; //100 Hoch
    
    
     hWnd = CreateWindow (winclass, "WinClipper", WS_OVERLAPPEDWINDOW, xwin, ywin, 400, 100, NULL, NULL, hInstance, NULL);
     glob=hWnd;
    
    
     ShowWindow(hWnd, nCmdShow);
     UpdateWindow(hWnd);
    
    
     while( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
     }
    
    
     return msg.wParam;
    }
    
    
    LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
     HDC hdc;
     PAINTSTRUCT ps;
     HBRUSH hbr;
     RECT crect, wrect;
     POINT pt;
    
    
     if (msg == WM_SIZE && wParam==SIZE_MINIMIZED) {
      hPopup=CreatePopupMenu();
      AppendMenu(hPopup,MF_STRING,1000,"&Close Server");
      ShowWindow(hWnd, SW_HIDE);
      nid.cbSize=sizeof(NOTIFYICONDATA);
      nid.uID=100;
      sprintf(nid.szTip,"Hallo");
      nid.uFlags=NIF_ICON;
      nid.hIcon=LoadIcon (NULL, IDI_APPLICATION);
      Shell_NotifyIcon(NIM_ADD, &nid);
     }
     if (msg == WM_DESTROY) {
      PostQuitMessage(0);
      return 0;
     }
    
    
     return DefWindowProc(hWnd,msg,wParam,lParam);
    }[/COLOR]              [/COLOR]
    Alles anzeigen

    das Fenster verschwindet, wie es soll, das Tray erscheint, wie es soll, und verschwindet dann, sobald man mit der Maus drüber geht, was es nicht soll. Warum verschindet das Tray?

    Einmal editiert, zuletzt von djtraumwelt (28. November 2008 um 10:44) aus folgendem Grund: farbe

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 28. November 2008 um 10:39
    • #2

    erstaunlich was sich die leute immer neues einfallen lassen, damit der code moeglichst ungut zu lesen ist. da findet mal jemand die code-tags und dann ist die schrift rot. :thumb:

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • djtraumwelt
    3
    djtraumwelt
    Mitglied
    Punkte
    85
    Beiträge
    12
    • 28. November 2008 um 10:43
    • #3

    ja, was weiß ich, warum die schrift rot ist, hab nichts anders gemacht, als bei anderen foren.

  • Jensi
    28
    Jensi
    Mitglied
    Reaktionen
    141
    Punkte
    8.486
    Beiträge
    1.649
    • 28. November 2008 um 13:47
    • #4

    Wir lieben doch alle rote Schrift, zumal sie Assoziationen mit sorgfältig korrigierten Schularbeiten weckt.

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 28. November 2008 um 16:06
    • #5

    Das Tray-Icon verschwindet immer dann auf die von dir beschriebene Art und Weise, wenn der Prozess nicht mehr lebt, der es erzeugt hat.

  • djtraumwelt
    3
    djtraumwelt
    Mitglied
    Punkte
    85
    Beiträge
    12
    • 28. November 2008 um 16:53
    • #6
    Zitat von Ringding

    Das Tray-Icon verschwindet immer dann auf die von dir beschriebene Art und Weise, wenn der Prozess nicht mehr lebt, der es erzeugt hat.

    Das hilft mir nicht weiter, der Prozess lebt nämlich noch. Hab das Tray mal Testweise in der Winmain schon erstellt und der Prozess lebt auf jeden fall, zumindest zeigt der Taskmanager mir die Tray.exe noch an, nur das Tray an sich ist weg.

  • djtraumwelt
    3
    djtraumwelt
    Mitglied
    Punkte
    85
    Beiträge
    12
    • 28. November 2008 um 17:51
    • #7

    Ok, hab den Fehler gefunden: mir hat das

    Code
    nid.hWnd=hWnd;


    gefehlt =(

    Hier nochmal der komplette Code, für alle die Ihr Clipboard auf 25 Speicherblöcke erweitern wollen:

    C
    #include <string.h>
    #include <windows.h>
    #include <shellapi.h>
    
    
    #define WM_SHELLNOTIFY WM_USER+5
    
    
    #define WINWID 200
    #define WINHGT 520
    
    
    HINSTANCE hInst;
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    DWORD WINAPI checkfunc (LPVOID);
    HANDLE Hcheck;
    
    
    NOTIFYICONDATA nid = {0};
    HMENU hPopup;
    
    
    HANDLE cdata;
    HWND hglob;
    HMENU hMenu;
    int endsig=0;
    int y;
    struct inhalt {
     char inh[10000];
    } inhalt[25];
    
    
    char checker[10000];
    
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR CmdLine, int nCmdShow) {
     MSG msg;
     BOOL bRet;
     hInst=hInstance;
     HWND hWnd;
     int xwin=0;
     int ywin=0;
    
    
     char winclass[] = "Fensterklasse";
     WNDCLASS wc;
    
    
     wc.style = CS_HREDRAW | CS_VREDRAW;
     wc.lpfnWndProc = WndProc;
     wc.cbClsExtra = 0;
     wc.cbWndExtra = 0;
     wc.hInstance = hInstance;
     wc.hIcon = LoadImage (hInstance,"icon.ico",IMAGE_ICON,32,32,LR_LOADFROMFILE);
     wc.hCursor = LoadCursor (NULL, IDC_ARROW);
     wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
     wc.lpszMenuName = NULL;
     wc.lpszClassName = winclass;
    
    
     RegisterClass (&wc);
    
    
     xwin=GetSystemMetrics(SM_CXSCREEN);
     ywin=GetSystemMetrics(SM_CYSCREEN);
     xwin /= 2;
     xwin -= (WINWID / 2);
     ywin /= 2;
     ywin -= (WINHGT / 2);
    
    
     hWnd = CreateWindow (winclass, "WinClipper", WS_OVERLAPPEDWINDOW, xwin, ywin, WINWID, WINHGT, NULL, NULL, hInstance, NULL);
     hglob=hWnd;
    
    
     ShowWindow(hWnd, nCmdShow);
     UpdateWindow(hWnd);
    
    
     while( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
     }
    
    
     return msg.wParam;
    }
    
    
    LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
     HDC hdc;
     HBRUSH hbr;
     PAINTSTRUCT ps;
     int xdiff, ydiff, yy;
     RECT crect, wrect;
     POINT pt;
    
    
     if (msg == WM_CREATE) {
      GetWindowRect(hWnd,&wrect);
      GetClientRect(hWnd,&crect);
      xdiff=(wrect.right - wrect.left) - crect.right;
      ydiff=(wrect.bottom - wrect.top) - crect.bottom;
      wrect.left=wrect.left - (xdiff / 2);
      wrect.top=wrect.top - (ydiff / 2);
      xdiff += WINWID;
      ydiff += WINHGT;
      MoveWindow(hWnd,wrect.left,wrect.top,xdiff,ydiff,TRUE);
      Hcheck=CreateThread(NULL,0,checkfunc,NULL,0,NULL);
      for (y=0; y < 25; y++) {
       sprintf(inhalt[y].inh,"---");
      }
     }
     if (msg == WM_PAINT) {
       hdc=BeginPaint(hWnd,&ps);
        for (y=0; y < 25; y++) {
        crect.left=0;
        crect.top=(y*20);
        crect.right=WINWID;
        crect.bottom=(y*20)+20;
        hbr=GetStockObject(BLACK_BRUSH);
        FillRect(hdc,&crect,hbr);
        DeleteObject(hbr);
        DrawText(hdc,inhalt[y].inh,-1,&crect,DT_CENTER|DT_VCENTER);
       }
       EndPaint(hWnd,&ps);
       return 0;
     }
     if (msg == WM_LBUTTONDOWN) {
      yy=HIWORD(lParam);
      yy/=20;
      if (yy < 25) {
       OpenClipboard(NULL);
       EmptyClipboard();
       HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (lstrlen(inhalt[yy].inh)+1));    //allocate memory as big as the text-string
       LPTSTR sMem = (CHAR*)GlobalLock(hMem);
       memcpy(sMem, inhalt[yy].inh, (lstrlen(inhalt[yy].inh)+1));
       GlobalUnlock(hMem);
       SetClipboardData(CF_TEXT, hMem);
       CloseClipboard();
      }
     }
     if (WM_SHELLNOTIFY && wParam==100) {
      if (lParam==WM_RBUTTONDOWN) {
       DestroyMenu(hPopup);
       hPopup=CreatePopupMenu();
       for (y=0; y < 25; y++) {
        AppendMenu(hPopup,MF_STRING,1000+y,inhalt[y].inh);
       }
       AppendMenu(hPopup,MF_STRING,1026,"Beenden");
       GetCursorPos(&pt);
       TrackPopupMenu(hPopup,TPM_RIGHTALIGN,pt.x,pt.y,0,hWnd,0);
      }
      if (lParam==WM_LBUTTONDBLCLK) {
       ShowWindow(hWnd,SW_RESTORE);
      }
     }
     if (msg == WM_COMMAND && lParam==0) {
      if (LOWORD(wParam)>=1000 && LOWORD(wParam)<1025) {
       yy=(LOWORD(wParam))-1000;
       OpenClipboard(NULL);
       EmptyClipboard();
       HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (lstrlen(inhalt[yy].inh)+1));    //allocate memory as big as the text-string
       LPTSTR sMem = (CHAR*)GlobalLock(hMem);
       memcpy(sMem, inhalt[yy].inh, (lstrlen(inhalt[yy].inh)+1));
       GlobalUnlock(hMem);
       SetClipboardData(CF_TEXT, hMem);
       CloseClipboard();
      }
      if (LOWORD(wParam)==1026) {
       DestroyWindow(hWnd);
      }
     }
     if (msg == WM_SIZE && wParam==SIZE_MINIMIZED) {
      hPopup=CreatePopupMenu();
      for (y=0; y < 25; y++) {
       AppendMenu(hPopup,MF_STRING,1000+y,inhalt[y].inh);
      }
      AppendMenu(hPopup,MF_STRING,1026,"Beenden");
      ShowWindow(hWnd, SW_HIDE);
      nid.cbSize=sizeof(NOTIFYICONDATA);
      nid.hWnd=hWnd;
      nid.uID=100;
      sprintf(nid.szTip,"Hallo");
      nid.uFlags=NIF_ICON+NIF_MESSAGE;
      nid.uCallbackMessage=WM_SHELLNOTIFY;
      nid.hIcon=LoadImage (hInst,"icon.ico",IMAGE_ICON,32,32,LR_LOADFROMFILE);
      Shell_NotifyIcon(NIM_ADD, &nid);
      return 0;
     }
     if (msg == WM_CLOSE) {
      Shell_NotifyIcon(NIM_DELETE,&nid);
      endsig=1;
     }
     if (msg == WM_DESTROY) {
      PostQuitMessage(0);
      return 0;
     }
    
    
     return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    
    
    DWORD WINAPI checkfunc (LPVOID var) {
     while(endsig==0) {
      OpenClipboard(hglob);
      cdata=GetClipboardData(CF_TEXT);
      CloseClipboard();
      sprintf(checker,"%s",cdata);
      if (strcmp(checker,inhalt[0].inh)==0) {
       Sleep(250);
      } else {
       for (y=24; y > 0; y--) {
        sprintf(inhalt[y].inh,"%s",inhalt[y-1].inh);
       }
       sprintf(inhalt[0].inh,"%s",checker);
       InvalidateRect(hglob,NULL,FALSE);
      }
     }
     ExitThread(0);
     return 0;
    }
    Alles anzeigen
  • Paulchen
    1
    Paulchen
    Gast
    • 28. November 2008 um 18:06
    • #8
    Zitat von djtraumwelt

    Hier nochmal der komplette Code, für alle die Ihr Clipboard auf 25 Speicherblöcke erweitern wollen

    Hast du das gemacht, um Windows-Programmierung zu lernen, oder, um diese Funktion zu erhalten? Falls Letzteres zutrifft, hast du wohl das Rad neu erfunden.

  • templar
    4
    templar
    Mitglied
    Reaktionen
    1
    Punkte
    116
    Beiträge
    22
    • 28. November 2008 um 22:29
    • #9

    Ich hab sowas mal mit MFC gemacht, viel schöner war der Code da auch nicht als mit reiner WinAPI *g*.

    Ich denk mal dabei gehts in erster Linie um Performance, so ein Systray-Proggi sollt halt idealerweise nur ein paar 100k brauchen, sonst könnte man das sicher einfacher machen.

    "Sausen Sie mit mir ins Laplace-Land" - KAISER 4ever :grinning_squinting_face:

  • Jensi
    28
    Jensi
    Mitglied
    Reaktionen
    141
    Punkte
    8.486
    Beiträge
    1.649
    • 29. November 2008 um 02:00
    • #10

    Warum gerade 25 "Blöcke"?

    Siehe die Zero-One-Infinity Rule!

  • djtraumwelt
    3
    djtraumwelt
    Mitglied
    Punkte
    85
    Beiträge
    12
    • 29. November 2008 um 12:39
    • #11
    Zitat von Paulchen

    Hast du das gemacht, um Windows-Programmierung zu lernen, oder, um diese Funktion zu erhalten? Falls Letzteres zutrifft, hast du wohl das Rad neu erfunden.

    Beides =) Zum einen möchte ich irgendwann mal möglichst gut programmieren können. Zum anderen habe ich diese Funktion wirklich gebraucht und nichts wirklich kostenloses oder gar open-source für windows gefunden.

    Naja, warum nicht 25 Blöcke? Ist doch ne schöne Zahl =)) das reicht aus, denke ich.

  • Jensi
    28
    Jensi
    Mitglied
    Reaktionen
    141
    Punkte
    8.486
    Beiträge
    1.649
    • 29. November 2008 um 14:44
    • #12
    Zitat von djtraumwelt

    Naja, warum nicht 25 Blöcke? Ist doch ne schöne Zahl =)) das reicht aus, denke ich.


    Warum nicht 24? Oder 26?

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung