ソフトキーがうまく動作しません

解決


なんで  2008-02-03 08:07:44  No: 29608

ソフトキーで入力したデータを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;


KHE00221  2008-02-03 08:47:35  No: 29609

「、」  は [,] のことかな?  

    // [?]
    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);


Fusa  2008-02-03 11:11:53  No: 29610

こんな風にすると、仮想キーの番号がわかりますね。
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


なんで  2008-02-03 17:53:02  No: 29611

KHE00221さん、Fusaさん、ありがとうございます。
うまく動作するようになりました。

>「、」  は [,] のことかな?  
すみません、ご指摘どおりです。

>キーコードを一覧にしておきました。
ありがとうございます。
なんで動かないかがよくわかりました。


なんで  2008-02-03 18:32:20  No: 29612

時々(というか、よく)キー入力を受け付けないことがあるんですが、
これは仕方のないことなんでしょうか?
ソフトキーのプログラムがアクティブになっていないのが原因と思い、
以下のようにしてみたんですが同じでした。

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;


KHE00221  2008-02-03 19:00:12  No: 29613

メモ帳やワードパッドだけど

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;

で普通に入力されるけど?


なんで  2008-02-03 19:29:38  No: 29614

KHE00221さん、お返事ありがとうございます。
エディタソフトからメモ帳に変更してみたのですが、
頻度は少なくなったようですが、まだ入力を受け付けなくなることがあります。
データが大量にあり、(数字3桁+英字1桁または無)キーボードから入力するよりも、
ソフトキーを作ったほうが速く入力できると思ったのですが。
エディタ部分も組み合わせて作ったほうがいいみたいですね。
この方法も検討してみます。
ありがとうございます。


KHE00221  2008-02-03 22:47:04  No: 29615

このようにループさせて 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;


なんで  2008-02-04 04:32:05  No: 29616

KHE00221さん、ありがとうございます。
うまく動かないのは環境のせいかもしれないです。
いくつかのソフトを動かしていますし...
エディタ部分を組み込み、Memoコンポーネントを使ってなんとかできるようになりました。
お手数をおかけしました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加