2017-02-08 22 views
-2

私は2つのコンポーネントを持っています。私はキーボードの文字を書く最初の1つで、私はkeybd_eventを使用してキーボードのプレス(キーを押し下げてキーアップ)を送信します。しかし、私が "o"を押すと、ord(Key)があります。これは111です(アスキーテーブルでOKです)。しかしkeybd_eventは、私はkeybd_eventのバイトに「キー」を変換することができますどのよう/Delphi keypressとkeybd_event

procedure TAutoComplete.AutoCompleteKeyPress(Sender: TObject; var Key: Char); 
var 
    iKeyValue: integer; 
begin 
    FXEdit.SetFocus; 

    iKeyValue := ord(Key); 

    keybd_event(iKeyValue, MapvirtualKey(iKeyValue, 0), 0, 0); 
    keybd_event(iKeyValue, MapvirtualKey(iKeyValue, 0), KEYEVENTF_KEYUP, 0); 
end; 

を出力しますか?

答えて

-1

Davidありがとうございます。ソーリーはドキュメンテーションのために、英語は私の最初の言語ではなく、私はすべてを理解していません。

ので、このコードは正常に動作します:あなたの代わりに[0..1] TInput`の `配列を使用することができるとき

procedure TAutoComplete.AutoCompleteKeyPress(Sender: TObject; var Key: Char); 
var 
    Input : TInput; 
    InputList: TList<TInput>; 
begin 
    FXEdit.SetFocus; 

    InputList := TList<TInput>.Create; 
    try 
     Input   := Default (TInput); 
     Input.Itype  := INPUT_KEYBOARD; 
     Input.ki.dwFlags := KEYEVENTF_UNICODE; 
     Input.ki.wScan := ord(Key); 
     InputList.Add(Input); 
     Input.ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP; 
     InputList.Add(Input); 

     SendInput(InputList.Count, InputList.List[0], SizeOf(TInput)); 
    finally 
     InputList.Free; 
    end; 
end; 
+0

' TList'は過剰です。あなたの代わりに可変長文字列から文字を送信する場合は 'TList'は、より理にかなって、それでも私の代わりに' TList'のTInput'のダイナミック '配列を選ぶでしょう。 –

+0

レミーあなたは正しい、ありがとうございました。 – Joc02

+0

これは質問された質問には答えません。 –

2

これは予想されます。 keybd_event関数はASCIIコードを受け付けません。それはvirtual key codesを受け入れます。 111VK_DIVIDEに対応します。

この情報はkeybd_eventのドキュメントに明記されています。私はあなたがこのドキュメントをよく読んでいないと思う。今、その省略をまっすぐにする時間です。

あなたが偽の下部ケースOしたい場合は、CAPSはがオフにして、偽のord('O')であることを起こる仮想キーコード$4Fの入力であるLOCKことを確認する必要があります。

最後に、あなたがkeybd_eventのドキュメントから拾い集めるだろう他の有用な情報は、あなたがすべてでそれを呼び出すべきではないということです。代わりにSendInputに電話する必要があります。