setwindowshookex und key aendern



  • hi,

    ich hoffe mir kann jemand helfen... 🙂

    ich haben einen globalen hook erstellt.
    jetzt moechte ich z.B. wenn die taste gedrueckt
    wird einen anderen tastencode weiterleiten.
    z.b.
    der benutzer drueck 'a'. jetzt soll aber nicht
    'a' sondern 'A' erscheinen (in einem beliebigen
    textfeld/anwendung/was auch immer).

    deshalb wollte ich es mit einem globalen hook machen:
    taste abfangen->taste aendern->geaenderte taste weiterleiten.

    geht das ueberhaept? kann mir da jemand vielleicht weiterhelfen?



  • Servus,

    ähm ja.... wo hängst denn? Irgendwie geht da keine direkte Frage hervor.... aber ich nehme mal meine Wunderkatze und reibe sie ein bis zweimal an meinem Toaster. Dann gibt es meistens ein klares Bild....

    *rubbel*

    Naja:

    Wenns dir darum geht aus dem Buchstaben die du bekommst einen Tastencode zu basteln, dann nehme VkKeyScan.

    Du wirst ja sowas wie ein MsgHook haben der dir die WM_KEYDOWN bzw KEYUP Msg abfängt. Im wParamteil steht der VK_KEY - Code und im lParamteil steht:

    MSDN schrieb:

    lParam
    Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table.
    0-15
    Specifies the repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
    16-23
    Specifies the scan code. The value depends on the OEM.
    24
    Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
    25-28
    Reserved; do not use.
    29
    Specifies the context code. The value is always 0 for a WM_KEYDOWN message.
    30
    Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up.
    31
    Specifies the transition state. The value is always zero for a WM_KEYDOWN message.

    Im Prinzip alles was du benötigst. Oder wie lautet deine richtige Frage??

    *winke*
    Hellsgore



  • Hellsgore schrieb:

    aber ich nehme mal meine Wunderkatze und reibe sie ein bis zweimal an meinem Toaster. Dann gibt es meistens ein klares Bild....

    *rubbel*

    😃 😃 😃
    Was ist das denn?



  • 🙂

    ok, ich versuchs nochmal...
    sorry wenn ich mich schlecht ausgedrueckt hab 🙂

    folgendes hab ich bzw. moechte ich.

    KeyboardProc ist die funktion die aufgerufen wird wenn
    eine taste gedrueckt wird.

    bsp.:
    der benutzer soll wenn er - irgendwo in windows -
    die taste 'a' drueckt ein 'b' bekommen.

    LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam)
    {
    	BYTE ks[256];
    	GetKeyboardState(ks);
    	WORD w;
    	UINT scan;
    	scan=0;
    	ToAscii(wParam,scan,ks,&w,0);
    	if ( (char)w == 'a' ) // mache jedes a zu einem b
    		CallNextHookEx( hkb, ncode, 'b', lParam ); // leite b statt a weiter
    
    	return CallNextHookEx( hkb, nCode, wParam, lParam );
    }
    

    ich kriege heraus, welche taste gedrueck wurde
    (ueber toascii). jetzt moechte ich:

    a)
    den keycode so aendern, dass es kein 'a' mehr is
    sondern ein 'b'
    (es gibt zwar ToUnicode aber ich blick nicht durch
    wie ich die benutzen kann :/)

    b)
    nicht der urspruengliche tastendruck, sondern der neue,
    von mir in der KeyboardProc funktion veraenderte,
    soll zum benutzer weitergeleitet werden.

    wie ich den hook installiere etc. weiss ich; das klappt auch.

    so, ich hoffe das war verstaendlicher und mir kann jemand
    helfen 😃



  • hmm.
    hat keiner ne ahnung? 😞



  • Servus,

    ich sitze hier gerade ohne meine Entwicklungsumgebung und schieße mal ins blaue..

    Bsp.:

    LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam) 
    { 
        BYTE ks[256]; 
        GetKeyboardState(ks); 
        WORD w; 
        UINT scan; 
        scan=0; 
        ToAscii(wParam,scan,ks,&w,0); 
        if ( (char)w == 'a' ) // mache jedes a zu einem b 
             return CallNextHookEx( hkb, ncode, 'b', lParam ); // leite b statt a weiter 
    
        return CallNextHookEx( hkb, nCode, wParam, lParam ); 
    }
    

    Wenn du den in der If verzeweigung änderst, dann solltest du diesen auch zurückgeben. In deinem Quellcode gibst du den wParam wieder zurück....

    Probiers mal aus...

    *winke*
    Hellsgore



  • ja.
    da is auch mein problem:
    - welchen parameter (wparam/lparam) muss ich aendern (oder beide?!)?
    - wie kriege ich den ascii code zurueck in unicode form und speichere
    das ganze in lparam bzw. wparam (es gibt die funktion tounicode, deren
    verwenudng ich allerdings nich raffe... :))


Anmelden zum Antworten