window styles nachträglich ändern
-
Hallo zusammen,
Ich habe ein kleines Problem mit dem nachträglichen Ändern von Window Styles. Ausgangspunkt meines Problems ist ein kleines Programm namens "Rad Host Client". Dieses ermöglicht es, gemoddeten PS2 über Netzwerk auf AVIs, MP3s, etc. auf Netwerkrechnern zuzugreifen, also so eine Art Mediacenter PS2 zu ermöglichen. Dieses funktionert aber nicht über Windows/SMB Freigaben, sondern mittels des oben genannten Programms.
Leider ist es nun so, das dieses Programm, sobald es gestartet wurde, natürlich die ganze Zeit laufen muss, um die angeforderten Dateien an die PS2 zu senden. Leider läuft dieses Programm nicht im SysTray, sondern als ganz normales Fenster, was etwas störend ist.
Meine Idee war es jetzt, das Programm über einen von mir geschriebenen Loader zu starten, die notwendige <ENTER> Taste an das Fenster zu senden und danach das Fenster "invisible" zu machen. Momentan habe ich aber nur die Suche des Fensters und das Ändern des Styles schnell mal codiert.
Ich habe also über EnumWindows das window handle gefunden, indem ich mit GetWindowText auf "Rad Host Client" geprüft habe. Danach hole ich mit mit GetWindowLong den Fensterstyle, blende WS_VISIBLE aus und setze den neuen style mit SetWindowLong. Das Fenster selbst ist auch nicht mehr sichtbar, aber jetzt mein kleines Problem:
Der Eintrag in der Taskleiste ist noch da und bleibt es auch.
Ich habe auch schon vollkommen andere Window Styles versucht zu setzen (z.B. WS_EX_TOOLWINDOW), aber der Eintrag in der Taskleiste bleibt immer da.
Anbei mal der Link zu dem Programm und mein Sourcecode. Ich hoffe, es kann mir jemand helfen.
Danke im voraus,
Alex
#include <windows.h> BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam); int main() { EnumWindows(EnumWindowsProc, 0); return 0; } BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { char l_text[300]; long l_styles; GetWindowText(hwnd, l_text, sizeof(l_text)); if(strcmp(l_text, "Rad Host Client 1.7") == 0) { l_styles = GetWindowLong(hwnd, GWL_STYLE); l_styles = l_styles ^ WS_VISIBLE; SetWindowLong(hwnd, GWL_STYLE, l_styles); UpdateWindow(hwnd); ShowWindow(hwnd, SW_HIDE); return FALSE; } return TRUE; }
-
Hi,...emmm LÖL, meinst du das:
#include <windows.h> void main() { ShowWindow(FindWindow(NULL, "Rad Host Client 1.7"), SW_HIDE); }also wie schwer es sich manche Leute machen ??!!

MfG CodeFinder
-
Keineswegs meinte ich dies, das wäre ja einfach, ausserdem ist FindWindow nicht unbedingt in allen Konstellation sicher zu benutzen (siehe MSDN). Also erst genau lesen und informieren, dann loslachen. Aber nichts für ungut.
Das Problem war nicht, das das Fenster ausgeblendet wird (das mache ich ja sogar quasi doppelt mit WS_VISIBLE und nochmal mit SHowWindow(hwnd, SW_HIDE)), sondern der verbleibende Eintrag in der Taskbar. Ich habe aber inzwischen durch ein bischen suchen eine Lösung gefunden:ITaskBarList
Alle, die also nervige Fenster einfach ausblenden wollen, das Programm aber weiterlaufen lassen wollen, könnten folgendes Beispiel hilfreich finden. Ist etwas schludrig codiert, aber naja, als einfache Demo...
Falls jemand LNK1103 Fehler auf die uuid.lib bekommt, das Problem resultiert aus der Kombination VS6.0 und dem aktuellsten Platform SDK, das VS6.0 nicht mehr supported. Einfach als Release kompilieren oder Debuginfo erstellen ausschalten.#include <windows.h> #include <ole2.h> #include <shlobj.h> typedef ITaskbarList *LPITaskbarList; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam); int main() { EnumWindows(EnumWindowsProc, 0); return 0; } BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { char l_text[300]; LPITaskbarList pTaskbar; GetWindowText(hwnd, l_text, sizeof(l_text)); if(strcmp(l_text, "Rad Host Client 1.7") == 0) { ShowWindow(hwnd, SW_HIDE); CoInitialize(0); CoCreateInstance(CLSID_TaskbarList,0, CLSCTX_INPROC_SERVER,IID_ITaskbarList,(void**)&pTaskbar); pTaskbar->HrInit(); pTaskbar->DeleteTab(hwnd); return FALSE; } return TRUE; }
-
hoi^^,
also...ich weiß immer noch nicht was du für ein Problem du hast...zu FindWindow():
MSDN schrieb:
This function does not search child windows. This function does not perform a case-sensitive search.
wenn du das meinst...hmm ->LOL, das ist für deine Zwecke (n Fenster ausblenden) nun nicht noch ne EnumProc nötig ...ich finde es ja (das Fenster
)...so... also wenn du mit TaskBar die Taskleiste meinst in dem sich jeden Fenster ablegt...dannnnnnn...ist mein Code PERFEKT!, dennnnn er blendet NICHT NUR das Fenster aus SONDERN löscht auch den 'Vermerk' also "Eintrag" - wie du es bezeichnet hast....hassu den Code überhaupt mal GETESTET ???...dann wär dein 'Nachtrag' nämlich ....hmmm erbärmlich^^ ?!
MfG CodeFinder
PS: Also ich hab mir das Tool auch runtergeladen und das auch alles so getestet...nach dem Entfernen auf meine Methode, also noch dem Programmstart von meinem MOD-Programm, war nix mehr von dem Progg(Rad Host Client 1.7) zu sehen, außer im Taskmgmer. ,....aber das wolltest du doch oder nicht ?!

-
Hallo nochmal,
Ich hab jetzt auch rausgefunden, warum das mit dem ShowWindow(hwnd, SW_HIDE) bei mir nicht funktioniert hat. Ich hatte das ja auch in meiner EnumProc drin. Aber ich habe natürlich das Flag für WS_VISIBLE falsch ausmaskiert (xor ist in diesem Fall vollkommen falsch) und damit den WindowStyle total zerschossen und zurückgesetzt. Dies hatte zur Folge, das zwar nach dem ShowWindow das Fenster verschwand, aber der Button in der Taskleiste seltsamerweise weiter vorhanden war. Der Dreizeiler ganz alleine funktioniert tatsächlich wie ich es wollte, FindWindow hatte ich mit GetWindow durcheinander gebracht. Also ganz klar mein Fehler, ich gebe es zu und nehme Spott und Schande auf mich.

Aber der Ehrenpreis für die umständlichste Lösung geht ganz klar an mich

-
Hauptsache glückliches Ende

AlexB schrieb:
Aber ich habe natürlich das Flag für WS_VISIBLE falsch ausmaskiert (xor ist in diesem Fall vollkommen falsch) und damit den WindowStyle total zerschossen und zurückgesetzt.
jo ich weiß, dachte das war klar
,
du hast das n bissl verhunzt 
AlexB schrieb:
Der Dreizeiler ganz alleine funktioniert tatsächlich wie ich es wollte, FindWindow hatte ich mit GetWindow durcheinander gebracht. Also ganz klar mein Fehler, ich gebe es zu und nehme Spott und Schande auf mich.
jojo, nit schlimm... ich fand deinen Code sehr 'akrobatisch'

AlexB schrieb:
Aber der Ehrenpreis für die umständlichste Lösung geht ganz klar an mich
allerdings
...
[
<
>
]MfG CodeFinder