TrayIcon & Position
-
Das wird ihm doch aber wahrscheinlich wenig nützen, wenn er noch ein Edit-Feld auf dem Fenster erstellen will.
Ich hab hier noch was gefunden um die Position des System Trays rauszubekommen, allerdings nicht für die einzelnen Icons: http://www.codeproject.com/shell/trayposition.asp
-
tool schrieb:
Das wird ihm doch aber wahrscheinlich wenig nützen, wenn er noch ein Edit-Feld auf dem Fenster erstellen will.
Warum nicht?
MSDN schrieb:
Currently, the following controls support custom draw functionality:
Header controls
List-view controls
Rebar controls
Toolbar controls
ToolTip controls
Trackbar controls
Tree-view controlsNote Custom draw is implemented in version 4.70 and later of Comctl32.dll for all the controls previously listed.
-
Ja, aber wo soll denn die Erstellung des Edit-Controls stattfinden? In der Zeichenroutine?
-
Natürlich... das komplette Ding muß er dann selber zeichnen... was ja der Inbegriff von Custom/Owner-Draw Controls ist...
-
Also erstmal besten Dank
Werd es erstmal mit dem Link von tool versuchen wenn das nicht funzt.
Versuch ichs mit Custom draw -> denn ich hab ja mein fenster schon fertig und wenn ich das richtig verstehe müsste ich da ja ganz anders rangehen.
Noch mal besten dank werd mich wohl im Forum anmelden denn das Problem hab ich schon in anderen Foren gepostet und da hatte nie jemand nen blassen schimmer oder einen Ansatz für mich.
Mfg TheBender
-
TheBender schrieb:
Meine Ballontips haben z.B. Eingabefelder und Button.
Und um ihn genau über dem Trayicon darzustellen brauch ich die Position des Trayicon.Wie wär's mit GetCursorPos()?
-
GetCursorPos()
wieso sollte der gerade über dem Icon sein
ich will ja nicht auf ein klick oder move over reagieren.ich hab die api jetzt schon so weit das ich die Trayicon verschieben kann und solche sachen. ne func für die pos hab ich auch in der api gefunden die funzt noch nich so richtig aber das wird
Mfg TheBender
-
noch einfacher wäre wenn du das beispiel von winapi.net nimmst
case WM_ICONCLICK: switch(lParam) { case WM_LBUTTONUP: { int xPos = LOWORD(lParam); int yPos = HIWORD(lParam); // und schon hast du den rechten unteren // punkt von deinem fenster } break; } return 0;
-
TheBender schrieb:
GetCursorPos()
wieso sollte der gerade über dem Icon sein
ich will ja nicht auf ein klick oder move over reagieren.
-
TheBender schrieb:
ne func für die pos hab ich auch in der api gefunden die funzt noch nich so richtig aber das wird
Zeig doch mal deine Versuche
-
flenders schrieb:
TheBender schrieb:
GetCursorPos()
wieso sollte der gerade über dem Icon sein
ich will ja nicht auf ein klick oder move over reagieren.hab ich schon auch gelesen, aber will er dann reagieren
-
mein kleines fenster soll wie ein ballontip aufgehen, nicht durch klicken, z.B. wenn ich was über winsock emfange oder die conection abgebrochen ist (WLAN)
@flenders
ich hab gerade keine zeit, poste morgen meine varianteMfg TheBender
-
Es geht ich kann die Position jetzt 100% genau herausfinden, nicht wie bei
dem Artikel www.codeproject.com der hatt mir aber sehr geholfen.Ich wusste garnicht was an der Taskleiste so alles manipulieren kann:
z.B.:
-Symbole andere Anwendungen entfernen
-Symbole hinzufügen
-die bilder ändern
-oder button deaktivierendas is ja echt fett
Mfg TheBender
-
www.codeproject.com ist kein Artikel! Gib den bitte nochmal mit einem vollständigen Link an. Danke.
-
WebFritzi schrieb:
www.codeproject.com ist kein Artikel! Gib den bitte nochmal mit einem vollständigen Link an. Danke.
ich glaub er meint den link von der ersten seite http://www.codeproject.com/shell/trayposition.asp
-
Es geht ich kann die Position jetzt 100% genau herausfinden
Verrätst du (später) noch wie das geht?
Weil gestern hattest du ja geschrieben, das du es heute erläuterst.
-
Hä? Das ist doch nur Fenstergefriemel da im Artikel. Das hat nichts mit der Position eines TrayIcons zu tun.
Ich habe mir folgendes gedacht: Am Anfang ist das TrayIcon ja ganz links angeordnet. Es könnte ja nun sein, dass man eine Nachricht bekommt, wenn sich das Icon verschiebt.
-
WebFritzi schrieb:
Hä? Das ist doch nur Fenstergefriemel da im Artikel. Das hat nichts mit der Position eines TrayIcons zu tun.
Der Meinung bin ich auch
WebFritzi schrieb:
Es könnte ja nun sein, dass man eine Nachricht bekommt, wenn sich das Icon verschiebt.
Dem ist nicht so
Ich hab nur den Ansatz verwendet:
if (_tcscmp(szClassName, _T("TrayNotifyWnd")) == 0)
Warum der Mensch dann auf einmal so ein Bockmist macht weiß ich auch nicht.
Dann hol ich mir das Handle von dem Kasten wo die Uhr und die Symbole drin sind.
Dann das Handle der Toolbar die in dem Kasten is und wenn man das hatt kann man fast auf die button zugreifen.
Nun muss man nur noch ne RECT var im Adressraum des Explorers Allocieren.
Dann Message an Toolbar Getbuttonrect oder so, Toolbar schreibt das Ergebniss in die RECT var im Speicher des Explorers und die klau ich ihm dann.
So kann man alle Messages an das Control Toolbar ausführen.Wenn ihr wollt kann ich ja nochmal den kompletten Quelltext posten.
Mfg TheBender
-
TheBender schrieb:
Warum der Mensch dann auf einmal so ein Bockmist macht weiß ich auch nicht.
Weil er davon ausgeht, dass die Windows mit der Entwicklung von Windows andere Klassennamen bekommen. Oder so ähnlich...
TheBender schrieb:
Dann hol ich mir das Handle von dem Kasten wo die Uhr und die Symbole drin sind.
Klar. OK.
TheBender schrieb:
Dann das Handle der Toolbar die in dem Kasten is und wenn man das hatt kann man fast auf die button zugreifen.
Oh, sehe ich grade zum ersten mal, dass das ne ToolBar ist. Kann es sein, dass das bei Win98 noch anders war? Könnte da evtl. mal jemand nachschauen?
TheBender schrieb:
Nun muss man nur noch ne RECT var im Adressraum des Explorers Allocieren.
DAS würde mich interessieren, wie du das machst.
TheBender schrieb:
Dann Message an Toolbar Getbuttonrect oder so, Toolbar schreibt das Ergebniss in die RECT var im Speicher des Explorers und die klau ich ihm dann.
So kann man alle Messages an das Control Toolbar ausführen.Aha. Und woher weißt du dann, welches DEIN Icon ist?
TheBender schrieb:
Wenn ihr wollt kann ich ja nochmal den kompletten Quelltext posten.
Jo, das mit dem Adressraum würde mich auf jeden Fall interessieren. Danke.
-
WebFritzi schrieb:
Weil er davon ausgeht, dass die Windows mit der Entwicklung von Windows andere Klassennamen bekommen. Oder so ähnlich...
Würde wenig sinn machen weil die Klassennamen ja in der ComCtl definiert sind wenn ich dan ein Prog wie Word98 unter win2000 nich mehr gehen. Da wird schon für genug Abwärtskompatibilität gesorgt.
WebFritzi schrieb:
Oh, sehe ich grade zum ersten mal, dass das ne ToolBar ist. Kann es sein, dass das bei Win98 noch anders war? Könnte da evtl. mal jemand nachschauen?
Ist sein Win95 und NT 4 schon so.
TheBender schrieb:
Nun muss man nur noch ne RECT var im Adressraum des Explorers Allocieren.
DAS würde mich interessieren, wie du das machst.
WebFritzi schrieb:
TheBender schrieb:
Dann Message an Toolbar Getbuttonrect oder so, Toolbar schreibt das Ergebniss in die RECT var im Speicher des Explorers und die klau ich ihm dann.
So kann man alle Messages an das Control Toolbar ausführen.Aha. Und woher weißt du dann, welches DEIN Icon ist?
Um rauszufinden welches icon meins ist gibt es zwei möglichkeiten:
- Message TB_BUTTONCOUN und annehmen das der letzte button meiner ist, da ich ihr ja erst von ein paar ms hinzugefügt habe.
- oder die bessere den button gleich mit der Message TB_ADDBUTTONS da hat man gleich ne ID.hier mein code
RECT posICON; HWND hShellTrayWnd = FindWindow("Shell_TrayWnd", NULL); //Taskleiste finden HWND hTrayNotifyWnd = FindWindowEx( hShellTrayWnd, NULL, "TrayNotifyWnd", NULL ); //Das rechte Kästel in der Taskleiste HWND hToolbarWindow32 = FindWindowEx( hTrayNotifyWnd, NULL, "ToolbarWindow32", NULL ); //Toolbar mit den Buttons if (hToolbarWindow32) { GetWindowRect( hToolbarWindow32, (LPRECT) &posICON ); TCHAR szClassName[256]; GetClassName( hToolbarWindow32, szClassName, 255 ); OutputDebugString( szClassName ); unsigned long pid; //ProcessID HANDLE process; //ProcessHandle GetWindowThreadProcessId( hToolbarWindow32, &pid ); //ProcessID holen process=OpenProcess( PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, pid ); //ProcessHandle holen //Im Adressraum der "SHELL" Speicher für ein "RECT" allocieren RECT *_posICON = ( RECT* )VirtualAllocEx( process, NULL, sizeof( RECT ), MEM_COMMIT, PAGE_READWRITE ); //Speicher in "SHELL" beschreiben WriteProcessMemory( process, _posICON, &posICON, sizeof( RECT ), NULL ); //Message an Toolbar (SHELL) ->Position des Button in "WPARAM", Adresse zur Speicherung des RECT´s in "LPARAM" SendMessage( hToolbarWindow32, TB_GETITEMRECT, ( WPARAM ) 5, ( LPARAM ) _posICON ); //Speicher in "SHELL" auslesen und in Localervariable speichern ReadProcessMemory( process, _posICON, &posICON, sizeof( RECT ), NULL ); //allocierten Speicher im Adressraum der "SHELL" wieder freigeben VirtualFreeEx( process, _posICON, 0, MEM_RELEASE ); //Koordinaten auf Desktopkoordinaten umrechnen MapWindowPoints( hToolbarWindow32, NULL, ( LPPOINT ) &posICON, 2 ); }
Ich werd das ganze noch in ne dll packen und alle function der Taskbar implementieren (Startmenü manipulieren, Schnellstart, Uhr und die normalen Button.
Header wirds für C und Delphi geben.Mfg TheBender