[C++] Blinken (bzw PFLASHWINFO)

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Wie der Titel schon erahnen lässt, habe ich ein kleineres Problem mit der struct PFLASHWINFO um ein Programm zum blinken zu bekommen, habe nach ca 3 Stunden immernoch nichts anderes als den Debugger als Ergebnis gesehen :)

Konkret beschränkt sich da das Problem auf die Member cbSize. Der Debugger zeigt mir jedesmal ein Problem an dieser Stelle an und ich habe keine Ahnung wieso... Habe als erstes diverse Zahlen ausprobiert, aber der Gedanke starb dann bald :)

Dann hatte ich auch folgendes:
Code:
PFLASHWINFO finfo;
finfo->cbSize=sizeof(finfo);

Das hat leider zum gleichen Ergebnis geführt. Darauf dachte ich mir, dass man mal vielleicht mal wieder etwas aus dem Marshall-Teil verwenden sollte,
Code:
System::Runtime::InteropServices::Marshal::SizeOf(System::Type ^t)

da allerdings nichts gefunden, was ich in die Paramterliste tun soll :)

Hat jemand eine Ahnung, wie ich da die richtige Grösse herbekomme?

Falls es wichtig ist: Das ganze läuft in einem separaten Thread und ist in einer Endlosschleife drin und ist als ganzes das verwalten von mehreren Sockets per select. Und bei gewissen Ereignissen sollte das Fenster halt blinken :)

Compiler ist Visual C++ 2008 und es handelt sich um eine Forms-Anwendung. Thread ist mit einem delegat und CreateThread erstellt.

Gruss
Cromon
 
Hi.

PFLASHWINFO ist ein Zeiger! Du hast allerdings keinen Speicher für diesen Zeiger reserviert und den Zeiger auch nicht initialisiert. Deshalb darfst du auf diesen Zeiger auch nicht zugreifen!

C++:
FLASHWINFO finfo;

finfo.cbSize = sizeof(finfo);
//...

FlashWindowEx(&finfo);
Gruß
 
Hallo!

Vielen Dank, jetzt funktioniert es :)

Das sind dann immer die kleinen Sachen, die man übersieht, hätte mir eigentlich beim "P" auffallen müssen, zumal ich mich noch gewundert habe, wieso -> zu verwenden ist und nicht . , da ich dachte, es sein kein Pointer.

Allerdings ist da noch ein kleineres Problem mit dem Stoppen des Blinkens. Eigentlich sollte es ja aufhören zu blinken, sobald das Fenster in den Vordergrund kommt. Macht es jedoch nicht.

Mal in der Referenz nachgschauft und gesehen, dass die Flag 0x0000000C eigentlich dafür sorgt, dass das Blinken stoppt, wenn das Fenster in den Vordergrund kommt. Das Problem ist nur, dass es jetzt gar nie mehr blinkt, egal wo das Fenster ist, ob im Hintergrund, oder im Vordergrund...

Habe mir dann gedacht, dass ich halt einen Thread mache in einer Endlosschleife, in der Überprüft wird, ob das Fenster einen Focus hat und wenn ja, dann wird FlashWindowEx mit der Flag 0 aufgerufen, um es zu stoppen. Hat jedoch auch nicht gewirkt, blinkt immer munter weiter, auch wenn es im Fokus ist!

Gruss
Cromon
 
Hi.

Poste deinen Code anstatt alles zu beschreiben, da kann sich keiner etwas drunter vorstellen.

Bei mir funktioniert's jedenfalls.

Gruß
 
Code:
FLASHWINFO inf;
inf.cbSize=sizeof(inf);
inf.dwFlags=0x0000000C;
inf.dwTimeout=0;
inf.hwnd=static_cast<HWND>(Handle.ToPointer());
inf.uCount=100;
FlashWindowEx(&inf);

Mit diesem Code tut sich dann überhaupt nichts.

Code:
FLASHWINFO inf;
inf.cbSize=sizeof(inf);
inf.dwFlags=0x00000002;
inf.dwTimeout=0;
inf.hwnd=static_cast<HWND>(Handle.ToPointer());
inf.uCount=100;
FlashWindowEx(&inf);

Damit blinkt es zwar, aber hört nie auf!
 
Code:
FLASHWINFO inf;
inf.cbSize=sizeof(inf);
inf.dwFlags=0x0000000C;
inf.dwTimeout=0;
inf.hwnd=static_cast<HWND>(Handle.ToPointer());
inf.uCount=100;
FlashWindowEx(&inf);

Mit diesem Code tut sich dann überhaupt nichts.
Ja, du hast ja auch nicht angegeben was blinken soll (die Titelleiste und/oder in der Taskleiste). Folglich blinkt natürlich auch nichts.
C++:
inf.dwFlags = 0x3 | 0xC;
Code:
FLASHWINFO inf;
inf.cbSize=sizeof(inf);
inf.dwFlags=0x00000002;
inf.dwTimeout=0;
inf.hwnd=static_cast<HWND>(Handle.ToPointer());
inf.uCount=100;
FlashWindowEx(&inf);

Damit blinkt es zwar, aber hört nie auf!
Kann ich nicht nachvollziehen. Ich hab's mit uCount = 10 probiert und es hört nach 10 mal blinken auf. Hast du denn auch 100 mal Blinken abgewartet?

Gruß
 
Ich danke, jetzt funktioniert alles! :)

Ist in der Online Hilfe sehr schlecht erklärt, da steht es so:
FLASHW_TIMERNOFG
0x0000000C
Flash continuously until the window comes to the foreground.

Wobei mir gerade der Gedanke kommt, dass es doch nicht so schlecht erklärt ist da... Könntest du mir, falls du Zeit hast, kurz erklären, wie du auf dieses Pärchen gekommen bist?

Zum 0x00000002 und dem "nie" noch: Mit nie meinte ich eigentlich, wenn man das Fenster anklickt geht es nicht weg, nach 100 stoppte es dann schon, aber vorher nicht, habe mich schlecht ausgedrückt :)
 
Könntest du mir, falls du Zeit hast, kurz erklären, wie du auf dieses Pärchen gekommen bist?
Also, eigentlich hab ich nur geschaut: was soll bei dem Fenster eigentlich blinken? Und wie soll es sich verhalten? Ich entschied mich für eben für FLASHW_ALL und dafür das es nur blinken soll wenn es nicht im Vordergrund ist - was ja meist das Verhalten von Programmen darstellt.

Gruß
 
Zurück