Win32 API Nachrichtenschleife ausnutzen

elfvyn

Mitglied
Servus allerseits
Hoffe das mir jemand mal einen Tipp geben kann...

Wärend ich so vor mich hinprogge bin ich in einem meiner Projekte auf die Idee gekommen, die Nachrichtenschleife eines Fensters als Endlosschleife für eine Grafikanwendung zu benutzen. Leider funktioniert dies nur bei weiterhin ankommenden Nachrichten von Maus, Tastatur etc. Mein Ziel ist es nun durch drücken einer Taste die Nachrichtenschleife weiterhin diese Taste immer wiederholt drücken zu lassen! Also ich fange die Message Pfeiltaste UP auf und starte einige meiner Routinen....anschließend soll jedoch diese Taste wieder gedrückt werden. Nach einigem versuchen habe ich eine Abfrage ob die Taste gedrückt wurde im unteren Teil der WndProc die genau das tut. Nun bin ich davon ausgegangen das er die Schleife rasendschnell ausführt und wollte dann ihrgendwie ein sleep() oder so einbauen, aber Pustekuchen....Er führt sie so einmal pro Sekunde aus....manchmal schneller manchmal langsamer, je nachdem welche Messages reinkommen. Somit läuft meine Grafikanwendung schneller wenn ich die Maus bewege als wenn ich garnichts mache. Gibts da ne Möglichkeit das anders zu machen?



LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
...

case WM_KEYDOWN:
{
switch(wParam)
{
case VK_UP: ...; ArrowKeys[1]=1; ... break;
}
}
...
}//end switch
if(ArrowKeys[1]==1)
{
SendMessage(hwnd,WM_KEYDOWN,VK_UP,NULL);
}
}//end WndProc()


thx schonmal im vorraus
 
Vielleicht klappt es mir PostMessage(...) besser als mit SendMessage(...). Probier's mal aus.
Abgesehen davon ist das glaube ich nicht so schön, die Nachrichtenschleife so zu mißbrauchen.
 
moin


Also so solltest du das jedenfalls nicht machen!

Ich versteh auch nciht richtig welchen Sinn das werden soll, so kommst du nciht mehr aus der Schleife heraus und warum du nciht einfach nen Timer nimmst

PostMessage ist nciht nötig SendMessage ist dort die bessere Wahl.


mfg
umbrasaxum
 
Ok hab noch ein paar sachen verändert.... und es scheint mit postmessage doch zu funktionieren jo supi!

thx
 
Timer
Wo meinst du jetzt sollte ich einen Timer einfügen? Um die Schleife langsamer laufen zu lassen Dann würde sSie aber noch langsamer laufen als jetzt schon...
 
moin


MIt nem Timer könntest du diesen Vorgang automatisieren.

Ich versteh auch nciht warum du ArrowKey[1] immer wieder auf eins setzt, da es doch eh 1 bleibt bist du es irgendwie wieder aufhebst, z.B. mit hilfe einesWM_KEYUP.


mfg
umbrasaxum
 
Naja so die Lösung war es dann wohl trotzdem noch nicht..... Er läuft zwar jetzt wie gewollt durch ist aber nicht mehr ansprechbar durch andere Messages von Tasten etc... Vorher ging das, trotz endlosschleife
 
warum du ArrowKey[1] immer wieder auf eins setzt, da es doch eh 1 bleibt bist du es irgendwie wieder aufhebst

Ich kann das ganze mithilfe der Pfeiltsten steuern und ich muss sicherstellen das immer nur eine gedrückt ist! demnach hab ich ein Array das die gedrückte Taste auf 1 setzt und alle anderen 0. So will ich realisieren das in meiner endlosschleife immer fortlaufend die gewünschte Message gesendet wird
 
moin


Aha.
Aber das lässt sich viel elganter machen:
Code:
static int ArrowKey[4];

switch(message)
{
case WMKEYDOWN:
{
    switch(wParam)
    {
    case WM_KEYDOWN:
    {
        case VK_UP:
            if(ArrowKey[1] == 0 && ArrowKey[2] == 0 && ArrowKey[3] == 0)
            {
                ArrowKey[0]=1;
                //Tueirgendwas anderes
            }
            return 0;
        case VK_DOWN:
            if(ArrowKey[0] == 0 && ArrowKey[2] == 0 && ArrowKey[3] == 0)
            {
                ArrowKey[1]=1;
                //Tueirgendwas anderes
            }
            return 0;
    }

    case WM_KEYUP:
    {
        case VK_UP:
                ArrowKey[0]=0;
                //Tueirgendwas anderes
               return 0;
        case VK_DOWN:
                ArrowKey[1]=0;
                //Tueirgendwas anderes
                return 0;
    }

So vermeidest du Endlosschleifen und es geht sehr schnell. Außerdem solltest du in Windows Programmen kein Sleep benutzen.


mfg
umbrasaxum
 
Zurück