Announcement

Collapse
No announcement yet.

Tastaturbuffer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tastaturbuffer

    Hi,
    wollte mal eine alte DOS Unit, die auf den Tastaturbuffer zugreift einbauen. Doch Delphi beschwert sich schon bei der einfachen absoluten addressierung:<br><br>

    <i>Flags:byte absolute $0040:$0017;</I><br><br>

    wäre eigentlich ausreichent, um die Flags zu setzten (Numlock etc.) doch leider sagt mir der Compiler:<br><br>
    <i>Segment/Offset-Paare werden in Borland 32-Bit-Pascal nicht unterstützt.</i><br><br>
    Kann ich mit dem integrietem Assembler auf den Tastatur Buffer zugreifen??? Wenn ja wie. Vielen Dank im Vorraus.<br>
    Emil

  • #2
    Hier eine Unit der Fachzeitschrift The Delphi Magazine:

    unit KeysU;<br>
    <br>
    interface<br>
    <br>
    procedure PressKey(Key: Char);<br>
    procedure ReleaseKey(Key: Char);<br>
    procedure SendKeys(const Keys: String);<br>
    <br>
    const<br>
    SnapShotWholeScreen: Boolean = False;<br>
    <br>
    implementation<br>
    <br>
    uses<br>
    WinTypes, WinProcs, Forms, SysUtils;<br>
    <br>
    const<br>
    KeyEventF_KeyDown = 0;<br>
    {$ifndef WIN32}<br>
    KeyEventF_KeyUp = $80; {It changes to 2 in Win32}<br>
    <br>
    procedure Keybd_Event; far; external 'USER' index 289;<br>
    <br>
    procedure PostVirtualKeyEvent(vk: Word; fUp: Boolean);<br>
    var<br>
    AXReg, BXReg: WordRec;<br>
    const<br>
    ButtonUp: array[Boolean] of Byte = (KeyEventF_KeyDown, KeyEventF_KeyUp);<br>
    begin<br>
    AXReg.Hi := ButtonUp[fUp];<br>
    AXReg.Lo := vk;<br>
    BXReg.Hi := 0; { not an extended scan code }<br>
    { Special processing for the PrintScreen key. }<br>
    { If scan code is set to 1 it copies entire }<br>
    { screen. If set to 0 it copies active window. }<br>
    if vk = vk_SnapShot then<br>
    BXReg.Lo := Byte(SnapShotWholeScreen)<br>
    else<br>
    BXReg.Lo := MapVirtualKey(vk, 0);<br>
    asm<br>
    mov ax, AXReg<br>
    mov bx, BXReg<br>
    call Keybd_Event<br>
    end;<br>
    end;<br>
    {$else}<br>
    procedure PostVirtualKeyEvent(vk: Word; fUp: Boolean);<br>
    var<br>
    ScanCode: Byte;<br>
    const<br>
    ButtonUp: array[Boolean] of Byte = (KeyEventF_KeyDown, KeyEventF_KeyUp);<br>
    begin<br>
    if vk = vk_SnapShot then<br>
    { Special processing for the PrintScreen key. }<br>
    { If scan code is set to 1 it copies entire }<br>
    { screen. If set to 0 it copies active window. }<br>
    ScanCode := Byte(SnapShotWholeScreen)<br>
    else<br>
    ScanCode := MapVirtualKey(vk, 0);<br>
    Keybd_Event(vk, ScanCode, ButtonUp[fUp], 0);<br>
    end;<br>
    {$endif}<br>
    <br>
    procedure PressKey(Key: Char);<br>
    begin<br>
    PostVirtualKeyEvent(Ord(Key), False)<br>
    end;<br>
    <br>
    procedure ReleaseKey(Key: Char);<br>
    begin<br>
    PostVirtualKeyEvent(Ord(Key), True)<br>
    end;<br>
    <br>
    procedure SendKeys(const Keys: String);<br>
    var<br>
    Loop: Byte;<br>
    begin<br>
    for Loop := 1 to Length(Keys) do<br>
    begin<br>
    PostVirtualKeyEvent(Ord(Keys[Loop]), False); { Press key }<br>
    PostVirtualKeyEvent(Ord(Keys[Loop]), True); { Release key }<br>
    end;<br>
    { Let the keys be processed }<br>
    Application.ProcessMessages;<br>
    end;<br>
    <br>
    end.<br>

    Ich hoffe es hilft dir

    Comment

    Working...
    X