Avatar billede flyvholm Nybegynder
15. maj 2007 - 16:28 Der er 28 kommentarer

VB System tray icon / C++

Jeg har sammen med Yates her inde fra fået skabt et ultra simpelt prgram, i C++, der forhindre min computer i at gå på pauseskærm.

Problemet er så bare at det efterlader mig med det her keddelige "cmd vindue".. Det kunne så være ultra sweet hvis man kunne få dette vindue til at minimere sig som et "System tray icon"

Jeg har fundet en løsning på dette her:

http://www.udvikleren.dk/VB/Article.aspx/224/

Men dette er i Virtual Basic, og programmet er lavet i C++, kan man på en eller anden måde kombinere de to sprog, eller er der en måde man kan gøre det samme i C++

Det skal lige siges at jeg er rimelig jomfruelig inden for C++/VB programering.. men helt sikkert noget jeg skal til at arbejde mere med..

-Flyvholm
Avatar billede stoorm Nybegynder
15. maj 2007 - 18:06 #1
hvorfor er det ikke bare du slår pauseskærmen fra ? :p
Avatar billede flyvholm Nybegynder
15. maj 2007 - 19:12 #2
Det er lidt af en længere forklaring.. men det kan man ikke pga. et sikkerhedssystem som IBM har oprettet på deres ThinkPad.

Og det er pisse irriterende at skulle sidde og scanne sin tommelfinger hvert 10 minut hvis man vil se en film.
Avatar billede bertelbrander Novice
15. maj 2007 - 20:10 #3
Metoden til at lave en tray-icon i C++ er beskrevet her:
http://damb.dk/trayicon.php

Der kommer nok en forbi der kan lave det.
Avatar billede duesjov Nybegynder
15. maj 2007 - 21:17 #4
lige en lille sidekommentar. kunne du ikke formatere, og så ligge en ren version af windows ind. på den måde plejer man at slippe for alt det lort der bliver lagt ind fra producentens side. plejer selv normalt at formatere pc'en, hvis jeg køber ny, for at slippe for alt deres crap
Avatar billede flyvholm Nybegynder
16. maj 2007 - 21:15 #5
Jeg har nogen oplysning på computeren der ik ret gerne skulle falde i andres hænder.. derfor den ekstra sikkerhed.. og derfor kan jeg heller ik bare gensinstallere windows..
Avatar billede flyvholm Nybegynder
18. maj 2007 - 07:39 #6
Ik nogen der er frisk på at hjælpe =)
Avatar billede yates Nybegynder
21. maj 2007 - 10:27 #7
Hej

dette er tricky, men måske kan jeg komme med et alternativt forslag.
Prøv at oprette et nyt projekt, denne gang er det en windows-application du skal vælge i st f console application .
I udgangspunbtet laver devC++ så noget kode for dig der gør ddet lettere at komme igang. Denne kode er for så vidt ok, men jeg foreslår at du sletter alt og paster nedenstående.
Når programmet starter op, laves et vindue som ikke vises. Dermed opstår heller ike nogen task bar icon/tab. Men der ligger heller ikke noget i systray. Eneste måde at nakke programmet på er så at trykke ctrl+alt+delete og lukke ned derfra.

VH
Y.


################################


#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;              /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
          0,                  /* Extended possibilites for variation */
          szClassName,        /* Classname */
          "Windows App",      /* Title Text */
          WS_EX_TOOLWINDOW, /* default window */
          CW_USEDEFAULT,      /* Windows decides the position */
          CW_USEDEFAULT,      /* where the window ends up on the screen */
          544,                /* The programs width */
          375,                /* and height in pixels */
          HWND_DESKTOP,        /* The window is a child-window to desktop */
          NULL,                /* No menu */
          hThisInstance,      /* Program Instance handler */
          NULL                /* No Window Creation data */
          );
   
    /* prevent scr saver */
      while (1)
      {
        sleep (60*1000);
        keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
      }

 

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);      /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
Avatar billede yates Nybegynder
21. maj 2007 - 10:30 #8
Det kan være nogle af de andre kan addere noget kode der løbende checker om en bestemt application (fremvisningsprogrammet) kører og som sørger for at lukke ned automatisk når det ikke længere kører. Dette ville jo være hamrende genialt. Kræver nok nogen der er meget mere skrap til windows api end jeg er.



Y.
Avatar billede flyvholm Nybegynder
24. maj 2007 - 16:16 #9
Hvor fedt Yates tak for det =P

Men det kunne nu være sweet hvis jeg kunne få den ned som et system tray ikon.. så er den lidt nemmer og afslutte.. har leget lidt frem og tilbage med koden fra damb.dk
ovenover.. men får en del fejlmeddelser desværre.. nogen der kan gennemskue den?
Avatar billede bertelbrander Novice
24. maj 2007 - 20:05 #10
Hvordan ser din kode ud?
Hvordan oversætter du?
Og hvilken fejl får du?
Avatar billede yates Nybegynder
25. maj 2007 - 09:17 #11
Hej,

BertelBrander, jeg har forsøgt at gøre dette lidt mere smart:
Tænker man kan starte application X via shellexe/createprocess i program Y. Dette giver et handle til application X som application Y løbende kan tjekke. Y kan så lukke sig selv så snart handle til X ikke længere er et handle til en kørende process. Mit problem er at jeg ikke kan finde en API der kan fortælle mig om et handle har at gøre med en kørende proces.  Handle som gives ved Shellexe etc er jo ikke et handle der går i NULL når X lukker.
Har du ikke et forslag som kan hjælpe videre her?

Y.
Avatar billede yates Nybegynder
25. maj 2007 - 10:25 #12
Hej,

prøv at se nedenstående kode.
Det shellexer Wordpad og tjekker hele tiden om vinduet 'Dokument - WordPad' er aktivt. I det øjeblik du selv lukker Wordpad, så lukker application sgu sig selv ned.
Aha! Dette princip kan du jo overføre til din egen application. Jeg ved ikke hvilket program du skal have kørende, men du kan sikkert selv rette navnet i de to linjer i koden nedenfor så de passser på din situation. Nu behøver du jo ikke engang en systray icon.
Y.




kode:
###########

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;              /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
          0,                  /* Extended possibilites for variation */
          szClassName,        /* Classname */
          "Windows App",      /* Title Text */
          WS_EX_TOOLWINDOW, /* default window */
          CW_USEDEFAULT,      /* Windows decides the position */
          CW_USEDEFAULT,      /* where the window ends up on the screen */
          544,                /* The programs width */
          375,                /* and height in pixels */
          HWND_DESKTOP,        /* The window is a child-window to desktop */
          NULL,                /* No menu */
          hThisInstance,      /* Program Instance handler */
          NULL                /* No Window Creation data */
          );
   
    //shell ex
   
    SHELLEXECUTEINFO info;
    memset(&info, 0, sizeof(info));
    info.cbSize = sizeof(info);
    info.lpVerb = "open";
    info.lpFile = "wordpad.exe";
    info.lpParameters = NULL;
    info.fMask = SEE_MASK_NOCLOSEPROCESS;
    info.nShow = SW_MINIMIZE;
    ShellExecuteEx(&info);
    sleep(1000);
    /* prevent scr saver */
    while (FindWindow(NULL, "Dokument - WordPad")!=NULL)
      {
        sleep (1000);
     
        keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
      }
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
Avatar billede yates Nybegynder
25. maj 2007 - 15:48 #13
Og her er så en endnu bedre version:

##########
#define WINVER  0x0500
#define _WIN32_IE 0x0500


#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
HICON HIcon;
int Flyvholm;
#define TRAY_MESSAGE (WM_APP +123)


/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";


int MakeTrayIcon(HWND hwndDlg)
{
  HIcon = (HICON )LoadImage(0,
                          "robin.ico",
                          IMAGE_ICON,
                          0,
                          0,
                          LR_DEFAULTSIZE | LR_LOADFROMFILE);
  NOTIFYICONDATA NotifyIconData;
 
  memset(&NotifyIconData, 0, sizeof(NotifyIconData));
  NotifyIconData.cbSize = sizeof(NotifyIconData);
  NotifyIconData.uID = 123;
  NotifyIconData.hWnd = hwndDlg;
  NotifyIconData.hIcon = HIcon;
  NotifyIconData.uFlags = NIF_ICON | NIF_MESSAGE;
  NotifyIconData.uCallbackMessage = WM_APP + 123;
  strcpy(NotifyIconData.szTip, "TrayTip");
  Shell_NotifyIcon(NIM_ADD, &NotifyIconData);
}


void RemoveTrayIcon(HWND hwndDlg)
{
  NOTIFYICONDATA NotifyIconData;
  memset(&NotifyIconData, 0, sizeof(NotifyIconData));
  NotifyIconData.cbSize = sizeof(NotifyIconData);
  NotifyIconData.uID = 123;
  NotifyIconData.hWnd = hwndDlg;
  NotifyIconData.hIcon = HIcon;
  NotifyIconData.uFlags = NIF_ICON | NIF_MESSAGE;
  NotifyIconData.uCallbackMessage = TRAY_MESSAGE;
  strcpy(NotifyIconData.szTip, "TrayTip");
  Shell_NotifyIcon(NIM_DELETE, &NotifyIconData);
}





int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;              /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
          0,                  /* Extended possibilites for variation */
          szClassName,        /* Classname */
          "Windows App",      /* Title Text */
          WS_OVERLAPPEDWINDOW, /* default window */
          CW_USEDEFAULT,      /* Windows decides the position */
          CW_USEDEFAULT,      /* where the window ends up on the screen */
          544,                /* The programs width */
          375,                /* and height in pixels */
          HWND_DESKTOP,        /* The window is a child-window to desktop */
          NULL,                /* No menu */
          hThisInstance,      /* Program Instance handler */
          NULL                /* No Window Creation data */
          );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, SW_HIDE);
    MakeTrayIcon(hwnd);
    //sleep (3000);
   
   
    Flyvholm=0;
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
               
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
        sleep(1000);
        keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        if (Flyvholm==1) goto out;
       
       
    }
    out:
    RemoveTrayIcon(hwnd);
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
      case TRAY_MESSAGE:
        if(lParam == WM_LBUTTONDOWN)
        {
         
          if (MessageBox(hwnd, "Press OK for at lukke!", "Uha, chefen kigger over skulderen", MB_OKCANCEL)==IDOK) Flyvholm=1;
         
         
        }
        break;

     
        case WM_DESTROY:
            PostQuitMessage (0);      /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
Avatar billede yates Nybegynder
25. maj 2007 - 15:50 #14
OBS: eksemplet ovenfor kræver at du lægger en ikon ind i samme directory som din application. Jeg har her kaldt den for "robin.ico" men du kan jo bare ændre som det passer dig. Hvis du kører eksemplet ovenfor uden at "robin-ico" findes så vises bare en tom ikon i din hylde. Heldigvis virker den stadig efter hensigten. I det øjeblik du klikker på ikonen får du en box hvor du blir bedt om aat bekræfte nedlukning. Hvis du gør dette stopper programmet og screensaver-suppressionen skulle ophøre.

Håber jeg...

Y.
Avatar billede flyvholm Nybegynder
29. maj 2007 - 14:00 #15
Hvor er i seje.. men ved ik om jeg gør noget forkert.. men jeg kan ik få den til at lukke ned.. dvs at den lukker lidt mærkeligt ned.. efter et stykke tid forsvinder icon´et.. sq svært at forklare hehe

Man kan os åbne programmet flere gange.. på en gang.. men dt kan jo egentlig være lige meget, bare en detalie..

ellers er det vildt fedt..
Avatar billede yates Nybegynder
30. maj 2007 - 08:35 #16
Ja,

på min computer går der også lidt tid (dog ikke ret meget) før windows faktisk opdaterer systray'en og har fjernet ikonet.
Hermed fik vi vist løst dit problem; kampen mod den onde screensaver er vundet.

Y.
Avatar billede flyvholm Nybegynder
31. maj 2007 - 14:48 #17
Yates

Er det kun på min computer at den ik registrere shift "tryk´ene" tror jeg gør et eller andet forkert når jeg generere exe filen..

Help me. o´ vise one =) og send et svar så du kan få de point =)
Avatar billede flyvholm Nybegynder
07. juni 2007 - 22:27 #18
det hele ser ud til at været gået i stå.. så tæt på at jeg havde et overdrevet fedt resultat.. plz hjælp mig med det sidste.. Virker det hos jer.. hos mig virker det ikke når den minimere sig..
Avatar billede flyvholm Nybegynder
09. juni 2007 - 18:28 #19
Yates

En sidste gang.. kom nu
Avatar billede yates Nybegynder
22. juni 2007 - 12:03 #20
Hej Flyvholm,,

beklager jeg har været på ferie i flere uger.
Jeg er ikke sikker på jeg ved hvad der kan være galt. Beklager så må du nok gå tilbage til modellen som skulle lukkes manuelt via Ctrl+Alt+Delete.
Y.
Avatar billede bertelbrander Novice
26. juni 2007 - 00:18 #21
Jeg modificerede yates program lidt, prøv det:
#define WINVER  0x0500
#define _WIN32_IE 0x0500
#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
void RemoveTrayIcon(HWND hwndDlg);
void MakeTrayIcon(HWND hwndDlg);
HICON HIcon;

#define TRAY_MESSAGE (WM_APP +123)
#define IDT_TIMER 1024
#define IDC_BUTTON1 130

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE,
                    LPSTR,
                    int)
{
  HWND hwnd;              /* This is the handle for our window */
  MSG messages;            /* Here messages to the application are saved */
  WNDCLASSEX wincl;        /* Data structure for the windowclass */

  /* The Window structure */
  wincl.hInstance = hThisInstance;
  wincl.lpszClassName = szClassName;
  wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
  wincl.style = CS_DBLCLKS;                /* Catch double-clicks */
  wincl.cbSize = sizeof (WNDCLASSEX);

  /* Use default icon and mouse-pointer */
  wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  wincl.lpszMenuName = NULL;                /* No menu */
  wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
  wincl.cbWndExtra = 0;                      /* structure or the window instance */

  wincl.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);

  /* Register the window class, and if it fails quit the program */
  if (!RegisterClassEx (&wincl))
      return 0;

  /* The class is registered, let's create the program*/
  hwnd = CreateWindowEx (0,                  /* Extended possibilites for variation */
                          szClassName,        /* Classname */
                          "Windows App",      /* Title Text */
                          WS_OVERLAPPEDWINDOW, /* default window */
                          CW_USEDEFAULT,      /* Windows decides the position */
                          CW_USEDEFAULT,      /* where the window ends up on the screen */
                          100,                /* The programs width */
                          85,                /* and height in pixels */
                          HWND_DESKTOP,        /* The window is a child-window to desktop */
                          NULL,                /* No menu */
                          hThisInstance,      /* Program Instance handler */
                          NULL);              /* No Window Creation data */

  /* Make the window visible on the screen */
  ShowWindow (hwnd, SW_SHOW);

  /* Run the message loop. It will run until GetMessage() returns 0 */
  while(GetMessage (&messages, NULL, 0, 0) > 0)
  {
      /* Translate virtual-key messages into character messages */
      TranslateMessage(&messages);
      /* Send message to WindowProcedure */
      DispatchMessage(&messages);

  }
  RemoveTrayIcon(hwnd);
  /* The program return-value is 0 - The value that PostQuitMessage() gave */
  return messages.wParam;
}

/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)                  /* handle the messages */
  {
  case WM_CREATE:
      CreateWindow("BUTTON",
                  "Enable",
                  WS_CHILD | WS_VISIBLE,
                  5, 5, 100, 30,
                  hwndDlg,
                  (HMENU)(IDC_BUTTON1),
                  0,
                  0);
      break;
  case TRAY_MESSAGE:
      if(lParam == WM_LBUTTONDOWN)
      {
        RemoveTrayIcon(hwndDlg);
        ShowWindow(hwndDlg, SW_SHOW);
        KillTimer(hwndDlg, IDT_TIMER);
      }
      break;
  case WM_COMMAND:
      if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_BUTTON1)
      {
        MakeTrayIcon(hwndDlg);
        ShowWindow(hwndDlg, SW_HIDE);
        SetTimer(hwndDlg, IDT_TIMER, 1000, 0);
      }
      break;
  case WM_TIMER:
      keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
      break;
  case WM_DESTROY:
      PostQuitMessage(0);      /* send a WM_QUIT to the message queue */
      break;
  default:                      /* for messages that we don't deal with */
      return DefWindowProc(hwndDlg, message, wParam, lParam);
  }
  return 0;
}

void MakeTrayIcon(HWND hwndDlg)
{
  if(HIcon == 0)
  {
      HIcon = (HICON )LoadImage(0,
                                "robin.ico",
                                IMAGE_ICON,
                                0,
                                0,
                                LR_DEFAULTSIZE | LR_LOADFROMFILE);
  }
  NOTIFYICONDATA NotifyIconData;

  memset(&NotifyIconData, 0, sizeof(NotifyIconData));
  NotifyIconData.cbSize = sizeof(NotifyIconData);
  NotifyIconData.uID = 123;
  NotifyIconData.hWnd = hwndDlg;
  NotifyIconData.hIcon = HIcon;
  NotifyIconData.uFlags = NIF_ICON | NIF_MESSAGE;
  NotifyIconData.uCallbackMessage = WM_APP + 123;
  strcpy(NotifyIconData.szTip, "TrayTip");
  Shell_NotifyIcon(NIM_ADD, &NotifyIconData);
}

void RemoveTrayIcon(HWND hwndDlg)
{
  NOTIFYICONDATA NotifyIconData;
  memset(&NotifyIconData, 0, sizeof(NotifyIconData));
  NotifyIconData.cbSize = sizeof(NotifyIconData);
  NotifyIconData.uID = 123;
  NotifyIconData.hWnd = hwndDlg;
  NotifyIconData.hIcon = HIcon;
  NotifyIconData.uFlags = NIF_ICON | NIF_MESSAGE;
  NotifyIconData.uCallbackMessage = TRAY_MESSAGE;
  strcpy(NotifyIconData.szTip, "TrayTip");
  Shell_NotifyIcon(NIM_DELETE, &NotifyIconData);
}
Avatar billede flyvholm Nybegynder
26. juni 2007 - 19:32 #22
Jeg får følgende fejl når jeg prøver på at generere .exe filen??? =(

Kompiler: Default compiler
Building Makefile: "C:\Dev-Cpp\Makefile.win"
Eksekverer  make clean
rm -f screenkiller.o  screenkiller.exe

g++.exe -c screenkiller.cpp -o screenkiller.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include" 

screenkiller.cpp: In function `void RemoveTrayIcon(HWND__*)':
screenkiller.cpp:158: error: expected `}' at end of input

make.exe: *** [screenkiller.o] Error 1

Eksekvering afbrudt
Avatar billede bertelbrander Novice
26. juni 2007 - 20:06 #23
Noget kunne tyde på at du mangler den sidste }
Avatar billede flyvholm Nybegynder
27. juni 2007 - 14:32 #24
Det virker forbløffende godt =) nu er det bare op til jer hvem der skal have points.. i må komme med et svar som jeg kan acceptere =)
Avatar billede bertelbrander Novice
27. juni 2007 - 20:43 #25
Jeg tror godt yates vil have point, det er også ham der har lavet det meste.
Jeg samler ikke på point.
Avatar billede flyvholm Nybegynder
28. juni 2007 - 00:29 #26
helt sikkert syntes jeg også =P Der er dog lige en ting.. når iconet er i system tray og så man prøver at lukke det er det somom at man "enable´er" det igen? kan man lave det som en start stop knap? -hvis du kan følge mig

Er det svært at lave nogen fancy grafix på start stop knappen? ik noget du skal gå i dybden med hvis det ik bare lige er til. =)

håber stadig du er frisk..

og tak for alt indtil vidre begge to =P

-Flyvholm
Avatar billede bertelbrander Novice
28. juni 2007 - 01:03 #27
Jeg er ikke sikker på at jeg forstår første del. Vi du have den til at lukke programmet når du trykker på ikonet i tray? Det burde ikke være noget problem.

Man kan godt putte et billede på "Enable" knappen, hvis det er den du tænker på.
Avatar billede flyvholm Nybegynder
12. juli 2007 - 08:08 #28
det er rigtigt forstået =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester