Entwickler-Ecke
Windows API - Shell_TrayWnd
maxk - Mi 28.04.04 18:52
Titel: Shell_TrayWnd
Hi,
ich versuche z.Z. einen eigenen Shelldesktop zu schreiben. Nun habe ich herausgefunden, dass ein sich im SysTray einlagerndes Programm an die Klasse Shell_TrayWnd eine WM_COPYDATA mit misteriösen Inhalten schreibt. Hat jemand schon mal versucht, die TrayIcons "direkt" zu erstellen oder kennt sich mit der Message jemand aus?
maxk
PS: Ihr könnt es ja selber mal versuchen! Explorer.exe abschießen, eine eigene Klasse Shell_TrayWnd erstellen, den Taskmanager starten (oder irgendein anderes Programm, das TrayIcons erstellt) und die CopyDatas abfangen.
PPS: Wenn jemand Lust hat mitzumachen, so möge er mir bitte Bescheid geben. Dann mache ich ein Gemeinschaftprojekt draus. Einfach wird's aber nicht :D
Delete - Mi 28.04.04 19:38
Was verstehst du unter einem eigenen eigenen Shelldesktop???
maxk - Mi 28.04.04 21:03
Naja, nen Desktop halt :wink: Startmenü, Startleiste, Desktopicons, Hotkeys wie (Win+R, Win+E, etc.). Hier ist z.B. ein Bild vom Talisman Desktop:
// Edit: Bild entfernt
Ihr müsst zugeben, dass das besser als der Explorer aus sieht :wink: Leider ist der Talisman keine Freeware und nicht sehr stabil.
maxk
maxk - Do 29.04.04 07:04
Besser erklärt: Der Windowsdesktop entspricht einem Fenstermanager unter X-Windows.
Um aber nicht vom Thema zu weichen, meine Frage ist, welche Copydata eine Application sended, um sich im Tray einzutragen, zu ändern, zu entfernen.
maxk
Delete - Do 29.04.04 09:45
Das macht nicht die Anwendung, sondern Windows, wenn die Funktion Shell_NotifyIcon mit dem Parameter NIM_ADD aufgerufen wird.
maxk - Do 29.04.04 15:20
Jein, der Aufruf dieser Funktion bewirkt, dass eine Copydata an das Fenter mit der Klasse
Shell_TrayWnd gesendet wird. Normalerweise erstellt der Explorer (Standarddesktop) diese Klasse. Wird jedoch nicht er sondern ein anderes Programm als Oberfläche geladen. Muss es selbst diese Klasse erstellen. Einfach mal ausprobieren! Ein solches Icon zu erstellen ist nicht das Problem, vielmehr Hand in Hand mit Windows zu arbeiten.
maxk
PS: Den Talisman gibt' unter
http://www.lighttek.com
maxk - Do 29.04.04 21:06
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| program Project1;
uses Windows,Messages,Dialogs,SysUtils;
{$WARNINGS OFF} {$HINTS OFF}
const ClassName='Shell_TrayWnd';
FUNCTION WndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; STDCALL; var x:^TCopyDataStruct; BEGIN Result := 0; CASE uMsg OF WM_COPYDATA: BEGIN x:=Pointer(lParam); MessageBox(0,x.lpData,nil,0); END; WM_CREATE: ; WM_DESTROY: PostQuitMessage(0); WM_COMMAND: ; ELSE Result := DefWindowProc(hWnd, uMsg, wParam, lParam); END; END;
VAR wc: TWndClassEx = ( cbSize: SizeOf(TWndClassEx); style: CS_OWNDC OR CS_HREDRAW OR CS_VREDRAW; cbClsExtra: 0; cbWndExtra: 0; hbrBackground: COLOR_WINDOW; lpszMenuName: NIL; lpszClassName: ClassName; hIconSm: 0; ); msg: TMSG; BEGIN wc.hInstance := HInstance; wc.hIcon := LoadIcon(HInstance, MAKEINTRESOURCE(1)); wc.hCursor := LoadCursor(0, IDC_ARROW); wc.lpfnWndProc := @WndProc; RegisterClassEx(wc); CreateWindowEx(WS_EX_WINDOWEDGE OR WS_EX_CONTROLPARENT OR WS_EX_APPWINDOW, ClassName,'Tray',WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_MINIMIZEBOX, 100,100,300,300,0,0,hInstance,NIL);
ExitCode := GetLastError; while True do begin if not GetMessage(msg, 0, 0, 0) then break; translatemessage(msg); dispatchmessage(msg); end; END. |
Ich geb's zu ich hab den Code von Assarbad geklaut... Aber zum Veranschaulichen reicht's. Einfach starten und anschließend mit dem Taskmanager den Explorer.exe abschießen. Nun sollte man viele MessageBoxes mit Copydatas erhalten. Wenn ihr dann man die Konstante ClassName ändern und den Vorgang wiederholt, werdet ihr feststellen, dass nichts passiert.
NeRoFiX - Do 29.04.04 22:09
hallo, sieht echt nach toller arbeit aus die du da machst..
der post hier ist ja schon ziemlich alt und deshalb will ich mal wissen ob du zwischenzeitlich schon was neues gemacht hast?
tommie-lie - Do 29.04.04 22:38
| maxk hat folgendes geschrieben: |
| Wenn ihr dann man die Konstante ClassName ändern und den Vorgang wiederholt, werdet ihr feststellen, dass nichts passiert. |
Irgendwie logisch, weil dann dein Fenster nicht mehr das Windows-Standardfenster der Klasse Shell_TrayWnd ist :roll:
So, dann schauen wir mal, was Google uns liefert.
Suchbegriff: Shell_TrayWnd
Aaaaha. Erstes Ergebnis bringt uns gleich zu
einem Post [
http://www.mail-archive.com/shell-coding@freelists.org/msg00297.html], der erklärt, was passiert wenn SHLoadInProc aufgerufen wird. Aber wir wollen ja die allgemeine Info, also schauen wir mal, was der
erste Post im Thread [
http://www.mail-archive.com/shell-coding@freelists.org/msg00292.html] hergibt. Huii, da erzählt er ja was von dwData und welchen Wert dieser wann hat. Klasse, jetzt weiß man ja schon, wann welcher Typ von WM_COPYDATA ankommt. Aber welche Data enthält er?
Also zurück zu Google.
Suchbegriff: Shell_TrayWnd Shell_NotifyIcon
Die ersten beiden Ergebnisse ist wieder unsere Mailinglist, die haben wir schon gesehen. Drittes Ergebnis: "Wie kann ich ein Fenster minimieren". Nee, das kann's nicht sein. Viertes Ergebnis: sieht aus wie irgendwelche Internas oder eine gute Anleitung, das könnte Interessant werden
*klick* [
http://www.cs.kent.edu/~kschaffe/sdn/articles/systray.html]. Ahhh, Kapitel "Intercepting System Tray Messages". Da steht doch tatsächlich, wie lpData aussieht, wenn dwData = 1 ist.
Na bitte, jetzt wissen wir ja, wo die NOTIFYICONDATA-Struktur ist, die die Anwendung an uns geschickt hat um ein Trayicon zu erzeugen. Hmm, was mach ich jetzt mit dem Ding? Ahaaa, das SDK sagt, daß in der Struktur unter anderem ein Handle auf ein Icon und ein Text für Tooltips enthalten ist. Hmm, wir sind eine Shell und kriegen gesagt, daß wir ein neues Tray-Icon anzeigen sollen und kriegen freundlicherweise auch gleich mitgeteilt, um welches Icon es sich handelt und was da für ein Text zu angezeigt werden soll. Na dann machen wir das doch mal. Wo war doch gleich die Taskbar Notification Area...?!...
maxk - Fr 30.04.04 07:02
| NeRoFiX hat folgendes geschrieben: |
hallo, sieht echt nach toller arbeit aus die du da machst..
der post hier ist ja schon ziemlich alt und deshalb will ich mal wissen ob du zwischenzeitlich schon was neues gemacht hast? |
Nebenbei lerne ich noch für die Schule :twisted:
@tommie-lie: Thx
tommie-lie - Fr 30.04.04 15:06
| NeRoFiX hat folgendes geschrieben: |
| der post hier ist ja schon ziemlich alt und deshalb will ich mal wissen ob du zwischenzeitlich schon was neues gemacht hast? |
Die Leute haben ein Zeitgefühl... :roll:
Meinst du nicht, daß eine Stunde (Differenz zwischen deinem Post und maxks Post davor) für eine komplette Lösung ein wenig knapp gewesen wäre? Ziemlich alt hätte ich gesagt, wenn maxk den ganzen Tag nichts anderes macht und fragt, wie er eins und eins zusammenzählt...
| maxk hat folgendes geschrieben: |
| @tommie-lie: Thx |
Google ist dein Freund ;-)
NeRoFiX - Fr 30.04.04 18:05
oh lol thx für den hinweis, hatte aufs anmeldedatum geschaut, ehem.. :oops:
das kommt alles nur von dem wenigen schlaf den mir mein pc gönnt ... :o
maxk - Fr 30.04.04 20:52
:D Danke nochmal (auch an Google). Es funktioniert alles wunderbar, jetzt kann's endlich weitergehen! Bis zum vollständigen Desktop ist es noch ein weiter Weg.
Thx to all,
maxk
tommie-lie - Fr 30.04.04 20:59
| NeRoFiX hat folgendes geschrieben: |
| das kommt alles nur von dem wenigen schlaf den mir mein pc gönnt ... :o |
Merkt man, denn ich denke nicht, daß du per Suche oder zufällig über einen Thread aus dem Jahre 2002 gestoßen wärst. Also hätte einem der gesunde Menschenverstand schon gesagt, daß ein Thread, wenn er weit oben in der Liste steht, nicht 2 Jahre alt sein kann. Und mangelnder Verstand sind typische Symptome von chronischer Schlaflosigkeit, das merke ich immer an mir :mrgreen:
@maxk: Du solltest unbedingt mehrere Desktops implementieren, mir reicht manchmal eine nicht, wenn ich unter Windows arbeite, und dann sehne ich mich immer nach 4 oder 6 Desktops wie unter Linux ;-)
maxk - Sa 01.05.04 15:31
| tommie-lie hat folgendes geschrieben: |
| @maxk: Du solltest unbedingt mehrere Desktops implementieren, mir reicht manchmal eine nicht, wenn ich unter Windows arbeite, und dann sehne ich mich immer nach 4 oder 6 Desktops wie unter Linux ;-) |
Geht klar, erstmal habe ich schon wieder ein anderes Problem. Mal sehen wenn ich es bis morgen nicht hinkriege, erstelle ich einen weiteren Thread...
PS: Ich habe schon einige Mails bekommen, wegen der Veröffentlichung des Quellcodes. Tja, da ich nicht sehr sauber programmiere und sehr mit dem Speicher rumsaue überlege ich mir doppelt ob ich den Source veröffentliche. Bitte keine Mails mehr. Bis jetzt sieht's so aus, als stehe einer Veröffentlichung (wenn's dann fertig ist) nichts im Weg. Kommt auf das Aussehen des Sourcecodes an :oops:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!