TrayIcon wieder löschen
-
Hallo Leute,
ich hab einen Dialog in einer DLL. Der wird beim Start von meinem Prog mit create erstellt und in den Tray geladen. Wenn ich das Programm beende wird der Dialog mot destroywindow oder so ähnlich beendet.
Aber der Icon bleibt noch im Tray bis ich mit der Maus drüber fahr. Wieso? Ist echt ärgerlich, denn beim nächsten Start hab ich dann zwei, 3 usw. Icons im Tray.Ciao,
Stalin
-
Schau mal bitte in die FAQ, dort gibt es ein ausführliches Thema zum Thema
TrayIcon (und wieder löschen)
-
Was glaubst was ich gemacht habe. Danke für die Antwort und für die absolut keine Hilfe. Ich hab hier
http://www.c-plusplus.net/forum/viewtopic.php?t=39045
mal reingeschaut und das ganze so implementiert.
Aber mein Icon bleibt trotzdem noch im Tray.
So und jetzt?Ciao,
Stalin
-
Dann geb uns doch mal den Source den du bei dir eingebunden hast!
Wir sind keine Hellseher! Vieleicht hast du da ja nur was vergessen oder ne kleinigkeit übersehen.
-
afx_msg void TapiRecieveDlg::OnSetinTray() { if(!m_pCallManager) { SetinTray(); } } afx_msg LRESULT TapiRecieveDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam) { switch(lParam) { case WM_LBUTTONDBLCLK: { ShowWindow(SW_SHOWNORMAL); UpdateData(FALSE); //set this dialog in forground SetForegroundWindow(); NOTIFYICONDATA tnd; tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = GetSafeHwnd(); tnd.uID = 1; return Shell_NotifyIcon(NIM_DELETE, &tnd); } } return 0; } ... void TapiRecieveDlg::SetinTray() { NOTIFYICONDATA tnd; HINSTANCE hinst = ::AfxGetResourceHandle(); ::AfxSetResourceHandle(GetBPhoneInstance()); ZeroMemory(&tnd, sizeof(NOTIFYICONDATA)); tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = this->GetSafeHwnd(); tnd.uID = 1; tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; tnd.uCallbackMessage = WM_NOTIFICATION; tnd.hIcon = GetIconFromResource(AfxGetResourceHandle()); lstrcpyn(tnd.szTip, "Addison Telefonie", sizeof(tnd.szTip)); Shell_NotifyIcon(NIM_ADD, &tnd); ShowWindow(SW_HIDE); //delete all contents of the listbox ((CNListBox*)GetDlgItem(ID_CTRL_TEXT))->ResetContent(); m_strNumber = ""; ::AfxSetResourceHandle(hinst); } ... LRESULT TapiRecieveDlg::CallfromTray() { NOTIFYICONDATA tnd; HINSTANCE hinst = ::AfxGetResourceHandle(); ::AfxSetResourceHandle(GetBPhoneInstance()); tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = GetSafeHwnd(); tnd.uID = 1; tnd.hIcon = GetIconFromResource(AfxGetResourceHandle()); ::AfxSetResourceHandle(hinst); return Shell_NotifyIcon(NIM_DELETE, &tnd); } ... #define WM_NOTIFICATION (WM_APP+100)So die CallfromTray Funktion wid kurz vor dem Destroy aufgerufen, da ich dachte das ich das ganze aus dem Tray holen muss bevor ich ein destroy machen kann. So ist da irgendwo ein Fehler?
Ciao und danke
Stalin
-
Ich vermisse die Defenition aus der Header :
afx_msg LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);ebenfalls vermisse ich das:
BEGIN_MESSAGE_MAP(CDeinDlg, CDialog) ON_MESSAGE(WM_NOTIFICATION, OnTrayNotification) END_MESSAGE_MAP()check das mal...
-
Nur habe ich halt nur das essentielle gepostet. Es funzt ja während dem Betireb wunderbar nur wird halt der Icon nach dem destroy-Aufruf von dem Dialog nicht gelöscht aus dem Tray, wenn der Dialog noch dort war.
-
In der MSDN findest du an dieser (shellcc/Shell/Shell_Int/Taskbar.htm#tbnotify_taskbarlist) Stelle folgendes:
// MyTaskBarDeleteIcon - deletes an icon from the taskbar status area. // Returns TRUE if successful, or FALSE otherwise. // hwnd - handle to the window that added the icon. // uID - identifier of the icon to delete. BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID) { BOOL res; NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = uID; res = Shell_NotifyIcon(NIM_DELETE, &tnid); return res; }Funktioniert super!
Das steht unter dem Thema: Handling the Taskbar