ソフトキーで入力したデータを1文字づつエディタに書き込むソフトを作っているのですが、だれか教えていただけたらうれしいです。
数字とアルファベット(小文字)はうまくいったのですが、「、」と「?」のデータがまったく入力できません。どうしてでしょうか?
----------
procedure TForm1.EditorInput(Data:Byte);
var
WinHnd : HWND; //ウィンドウのハンドル
begin
//MMEdITORを探す
WinHnd := FindWindow('MMEDITOR', nil);
//MMEdITORをアクティブに
SetForegroundWindow(WinHnd);
Keybd_event(Data, 0, 0, 0);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
EditorInput(63);//「?」<<< 数字アルファベットはOK
end;
「、」 は [,] のことかな?
// [?]
Keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY, 0);
Keybd_event(191, 0, KEYEVENTF_EXTENDEDKEY, 0);
Keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Keybd_event(191, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
// [,]
Keybd_event(188, 0, KEYEVENTF_EXTENDEDKEY, 0);
Keybd_event(188, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
こんな風にすると、仮想キーの番号がわかりますね。
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Memo1.Lines.Add( IntToStr(Key) );
Memo1.Lines.Add( IntToHex(Key,2) );
end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
Key := #0;
end;
キーコードを一覧にしておきました。
http://delfusa.main.jp/delfusafloor/technic/technic/068_PressKeyCode.html
KHE00221さん、Fusaさん、ありがとうございます。
うまく動作するようになりました。
>「、」 は [,] のことかな?
すみません、ご指摘どおりです。
>キーコードを一覧にしておきました。
ありがとうございます。
なんで動かないかがよくわかりました。
時々(というか、よく)キー入力を受け付けないことがあるんですが、
これは仕方のないことなんでしょうか?
ソフトキーのプログラムがアクティブになっていないのが原因と思い、
以下のようにしてみたんですが同じでした。
procedure TForm1.FormCreate(Sender: TObject);
begin
WinHnd_Editor := FindWindow('MMEDITOR', nil);
WinHnd_Me := FindWindow('ProSofKey', nil);
end;
...
procedure TForm1.EditorInput(Data:Byte);
begin
SetForegroundWindow(WinHnd_Editor); //MMEdITORをアクティブに
Keybd_event(Data, 0, 0, 0);
SetForegroundWindow(WinHnd_Me); //このソフトをアクティブに
end;
メモ帳やワードパッドだけど
procedure TForm2.Button1Click(Sender: TObject);
var
H1 : HWND;
begin
//どちらか
H1 := FindWindow(nil,'無題 - メモ帳');
H1 := FindWindow(nil,'ドキュメント - ワードパッド');
if H1 <> 0 then
begin
SetForegroundWindow(H1);
Keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY, 0);
Keybd_event(191, 0, KEYEVENTF_EXTENDEDKEY, 0);
Keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Keybd_event(191, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Keybd_event(188, 0, KEYEVENTF_EXTENDEDKEY, 0);
Keybd_event(188, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
end;
で普通に入力されるけど?
KHE00221さん、お返事ありがとうございます。
エディタソフトからメモ帳に変更してみたのですが、
頻度は少なくなったようですが、まだ入力を受け付けなくなることがあります。
データが大量にあり、(数字3桁+英字1桁または無)キーボードから入力するよりも、
ソフトキーを作ったほうが速く入力できると思ったのですが。
エディタ部分も組み合わせて作ったほうがいいみたいですね。
この方法も検討してみます。
ありがとうございます。
このようにループさせて 10 * 100 入力させても問題ないですが?
var
H1 : HWND;
I,J : Integer;
begin
//どちらか
H1 := FindWindow(nil,'無題 - メモ帳');
H1 := FindWindow(nil,'ドキュメント - ワードパッド');
if H1 <> 0 then
begin
SetForegroundWindow(H1);
for J := 0 to 99 do
begin
for I:=0 to 9 do
begin
Keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY, 0);
Keybd_event(191, 0, KEYEVENTF_EXTENDEDKEY, 0);
Keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Keybd_event(191, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Keybd_event(48+I, 0, KEYEVENTF_EXTENDEDKEY, 0);
Keybd_event(48+I, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
Keybd_event(13, 0, KEYEVENTF_EXTENDEDKEY, 0);
Keybd_event(13, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
end;
KHE00221さん、ありがとうございます。
うまく動かないのは環境のせいかもしれないです。
いくつかのソフトを動かしていますし...
エディタ部分を組み込み、Memoコンポーネントを使ってなんとかできるようになりました。
お手数をおかけしました。
ツイート | ![]() |