Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563

    C - Win32 - Menu in NotifyIconData

    Ho una struttura NotifyIconData che utilizzo per visualizzare un dato messaggio

    codice:
    	memset(&ref,0,sizeof(ref));
    	ref.cbSize = sizeof(NOTIFYICONDATA);
    	ref.uID = 10182;
    	ref.uFlags = NIF_ICON|NIF_INFO|NIF_ICON|NIF_MESSAGE;
    	ref.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
    	ref.dwInfoFlags = NIIF_ERROR;
    	ref.uVersion = NOTIFYICON_VERSION;
    	ref.uCallbackMessage = 98765;
    	strcpy_s(ref.szInfo,"Messaggio!");
    	strcpy_s(ref.szInfoTitle,"Titolo");
    	strcpy_s(ref.szTip,"AltroMessaggio");
    Ora ho alcuni problemi.
    In primo luogo, affinchè possa captare i messaggi che vengono mandati, sembra sia necessario specificare un'HWND che indica la finestra associata all'icona della traybar. Il problema principale è che io non ho una finestra associata. Devo per forza crearne una? Esiste un modo per creare una finestra "inutile" di dimensione 0 senza stile e senza niente? Giusto il necessario per poter usare il ciclo dei messaggi?

    Come posso visualizzare un menu' sulla traybar? Mi sembra che TracPopMenuEx faccia al casomio, ma purtroppo chiede sembre la solita HWND che io non ho.

    In secundis, se passo con il mouse sull'icona, questa stranamente sparisce!!!
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  2. #2

    Re: C - Win32 - Menu in NotifyIconData

    Originariamente inviato da XWolverineX
    In primo luogo, affinchè possa captare i messaggi che vengono mandati, sembra sia necessario specificare un'HWND che indica la finestra associata all'icona della traybar. Il problema principale è che io non ho una finestra associata. Devo per forza crearne una?
    Sì.
    Esiste un modo per creare una finestra "inutile" di dimensione 0 senza stile e senza niente? Giusto il necessario per poter usare il ciclo dei messaggi?
    Sì, ma ti devi comunque fare la trafila "normale" di RegisterClassEx e di CreateWindowEx; al massimo ti puoi evitare il RegisterClassEx usando la classe di sistema già registrata "Message" (per finestre con soli messaggi), ma ti sconsiglio di farlo, visto che tale classe è riservata ad un uso interno di Windows, non ti consente di risparmiare molto tempo e credo che potrebbe causarti problemi con TrackPopupMenu.
    Come posso visualizzare un menu' sulla traybar? Mi sembra che TracPopMenuEx faccia al casomio, ma purtroppo chiede sembre la solita HWND che io non ho.
    Hai bisogno di una finestra; stai particolarmente attento alla sezione Remarks della documentazione di TrackPopupMenu, contiene informazioni importanti riguardo all'uso dei menu contestuali con le icone di notifica.
    In secundis, se passo con il mouse sull'icona, questa stranamente sparisce!!!
    Credo che dipenda dal fatto che tu non hai specificato un HWND; quando passi il puntatore sopra l'icona Windows prova ad inviare il WM_MOUSEMOVE alla tua WNDPROC, non la trova e quindi fa sparire l'icona; penso sia un comportamento pensato per le applicazioni che terminano e si dimenticano di rimuovere l'icona dall'area di notifica.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Ho cominciato creando una DialogBox e caricandola senza però mai mostrarla con CreateDialog.
    Il problema è che non arrivano i messaggi desiderati. Ne arriva soltanto 1 dalla mia icona (ma non è quello che mi serve).

    codice:
    INT_PTR CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	if (uMsg == WM_USER + 1100) // solo una volta supera questo test. eppure io premo sull'icona varie volte.
    		if (lParam == WM_RBUTTONDOWN)
    		{
    			SetForegroundWindow(fakedialog);
    			TrackPopupMenuEx(Menu,TPM_RIGHTALIGN,100,100,fakedialog,NULL);
    		}
    	return 0;
    }
    
    	Menu = LoadMenu(hInstance,MAKEINTRESOURCE(ID_MENU));
    	fakedialog = CreateDialogParam(hInstance,MAKEINTRESOURCE(FAKE_DIALOG),GetDesktopWindow(),DialogProc,NULL);
    
    // e poi al punto giusto
    
    ref.hWnd = fakedialog; // ref è un NOTIFYICONDATA
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    aiuti?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  5. #5
    Non saprei... puoi postare un link al progetto che ci do direttamente un'occhiata?
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Dunque basilarmente le parti sono queste

    codice:
    	Menu = LoadMenu(hInstance,MAKEINTRESOURCE(ID_MENU));
    	fakedialog = CreateDialogParam(hInstance,MAKEINTRESOURCE(FAKE_DIALOG),GetDesktopWindow(),DialogProc,NULL);
    Se metto NULL come parentwindow fakedialog = NULL. Non sapendo come fare, ho messo il primo HWND che mi è venuto in mente.

    codice:
    	memset(&ref,0,sizeof(ref));
    	ref.cbSize = sizeof(NOTIFYICONDATA);
    	ref.uID = 10182;
    	ref.uFlags = NIF_ICON|NIF_INFO|NIF_ICON|NIF_MESSAGE;
    	ref.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
    	ref.dwInfoFlags = NIIF_ERROR;
    	ref.hWnd = fakedialog;
    	ref.uVersion = NOTIFYICON_VERSION;
    	ref.uCallbackMessage = WM_USER + 1100;
    	strcpy_s(ref.szInfo,"Errore!");
    	strcpy_s(ref.szInfoTitle,"errore");
    	strcpy_s(ref.szTip,"errore");
    Ed ecco la DialogProc che mai arriva ad eseguire le istruzioni.

    codice:
    INT_PTR CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	if (uMsg == WM_USER + 1100)
    		if (lParam == WM_RBUTTONDOWN)
    		{
    			SetForegroundWindow(fakedialog);
    			TrackPopupMenuEx(Menu,TPM_RIGHTALIGN,100,100,fakedialog,NULL);
    		}
    	return 0;
    }
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Con un link ad un progetto gia' costruito e compilabile, si risparmia tempo e permette di darti un aiuto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Il problema è che il codice è un pò incasinato (altri pezzi, riferimenti, librerie esterne)...cercherò di estrarre le parti necessarie e fare un progetto compilabile.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Ho fatto l'upload di un esempio a questo link. Spero di non aver dimenticato niente.

    Il punto è far uscire il menù creato al click col tasto destro. Il problema è che il messaggio scelto (WM_USER + 1100) non arriva mai alla DialogProc.

    Thank you!
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.