タッチパネル用テンキープログラムを作成するには?

解決


コウ  2005-04-15 10:30:58  No: 120974

始めまして。コウと申します。
現在VBプログラムに興味を持ち、プログラミングを始めたばかりです。そこで仕事で便利に利用できるタッチパネル式テンキープログラムなるものを作成してみようと思ったのですが、色々本など読んでも分かりませんでした。使用ソフトはVB6.0です。どなたかサンプルプログラムなどご教授して頂け
る方がおられましたら宜しくお願い致します。


ふらっと  2005-04-15 21:08:12  No: 120975

何が分からないのか具体的に示さないと
質問と作成依頼は意味がちがいますよ。


コウ  2005-04-16 01:22:00  No: 120976

ふらっとさんすみません。
まだVB始めたばかりで質問の仕方もどう聞いてよいかわかりません。
説明しますと、VBフォームでテンキーのような1〜9までのCommandを作り、1〜9のCommandをクリックするとEXCELや他アプリケーションにキーボードで入力した時と同じように表示させたいのです。Command1へ書き込むコードとか教えて頂けないでしょうか。宜しくお願いします。


ふらっと  2005-04-16 07:09:06  No: 120977

何もイメージがない人に教えるほど難しいものはないですね。
どこから説明して良いやら。。。

とりあえずWindowsAPIのSendMessageを調べて、特定のアプリケーション
(メモ帳とか)に入力するものを作ってみてはどうですか?

その手の質問なら過去ログにあったような気がします。


Say  2005-04-16 09:00:57  No: 120978

キーストロークの合成をしたい、というのならkeybd_eventで。

ボタンをクリックしたら、当然、
そのボタンのあるWindowがActiveになり、そのボタンにFocusが来ますから、
キー入力先をどうやって特定するか考える必要があるかと。


コウ  2005-04-17 08:39:35  No: 120979

お世話になります。ご返答ありがとうございました。
>とりあえずWindowsAPIのSendMessageを調べて、特定のアプリケーション
(メモ帳とか)に入力するものを作ってみてはどうですか?
過去ログ参照して調べてみます。
>キーストロークの合成をしたい、というのならkeybd_eventで。
Keybd_event調べてみます。
まず調べてまたカキコします。ご指導ありがとうございます。


コウ  2005-04-18 07:26:17  No: 120980

お世話になります。
色々調べてみました。現在まずVBソフトでテンキーを作成し、画面上のボタンをクリックするとキーボードのテンキーを押した時と同じように、その入力をテキストボックスに表示しようと考えています。それで次のコードがありました。
  Private Sub Command1_Click(Index As Integer)
    Text1.SelText = CStr(Index)
  End Sub
これを使用する事によってcommand1のIndex値(1〜・・)はをテキストボックスに表示出来ました。そこでAPIのkeybd_eventでの数値入力しようとコードをいれました。しかし、
Private Sub Command1_Click(Index As Integer)
Call keybd_event(VK_WIN, 0, 0, 0)  'Winキーを押す
   Select Case Index    
     Case 0
        Call keybd_event(VK_D, 0, 0, 0)  '全ウインドウ最小化
Call keybd_event(VK_WIN, 0, KEYEVENTF_KEYUP, 0)  'Winキーを放す
End Sub
などテキストボックスに表示しないkeybd_eventは出来ますが
Call keybd_event(VK_DECIMAL, 0, 0, 0)  '少数点キー
などテキストボックスへ表示するkeybd_eventは表示させる事ができません。テキストボックスへはIndex値が表示されます。たびたび申し訳ありませんがご存知でしたら解決方法教えて頂けませんか?宜しくお願いします。


Say  2005-04-18 09:16:46  No: 120981

>などテキストボックスへ表示するkeybd_eventは表示させる事ができません。
キー入力が何に対して行われるか考えれば明白かと。
既述の注意点を読み返すように。

>テキストボックスへはIndex値が表示されます。
そういうコードを書いているからでは?


コウ  2005-04-19 06:21:43  No: 120982

ご返答ありがとうございます。
>キー入力が何に対して行われるか考えれば明白かと。
>既述の注意点を読み返すように。
Private Sub Command1_Click(Index As Integer)のIndex As Integerはselect Caseで使用するため必要ですよね。多分  Text1.SelText = CStr(Index)  がIndex値をtext1へ入力だと思います。ですので、  Text1.SelText = CStr(Index)の部分をkeybd_eventをtext1へ表示というコードに書き換えてやればいいと思うのですが、そのコードがわかりません。
そういう事であってますか?お願いします。


Say  2005-04-19 08:45:31  No: 120983

keybd_eventは、あくまでキー入力を擬似的に発生するだけの関数です。
通常、キーを押したらどこに入力されるか考えてください。

また、ボタンを押したら、その瞬間にFocusがボタンに移動するため、
ボタンのクリックイベントプロシージャ実行開始時には、
必ず押したボタンにFocusがあることにも留意してください。

さて、TextBoxにキー入力するにはどうすればいいでしょう?


コウ  2005-04-20 08:32:48  No: 120984

お世話になります。
色々調べました。
>keybd_eventは、あくまでキー入力を擬似的に発生するだけの関数です。
>通常、キーを押したらどこに入力されるか考えてください。
通常何かのキーを押した場合アクティブ画面の選択されたなにかしらの範囲(コントロール・Textbox・セルなど)に表示されると思います。
>また、ボタンを押したら、その瞬間にFocusがボタンに移動するため、
>ボタンのクリックイベントプロシージャ実行開始時には、
>必ず押したボタンにFocusがあることにも留意してください。
そうですよね。。それをふまえて、
AppActivate "FORM1 - Project1.exe"  

textBox.Focus
などで試してみましたがだめでした。本当にここは難しいです。申し訳ありません。お願いします。


ガッ  2005-04-20 08:57:12  No: 120985

※横スマソ
とりあえず、自分にフォーカスが移ってきても、
直前のウィンドウにフォーカスを持っていかないと入力可能な状態にならないということなので、
「直前の、自分以外のウィンドウハンドルを取得する」プログラムを作ってみますた。

'Form1.frm
'タイマー:Timer1を貼り付ける。
Option Explicit
Private Declare Function GetForegroundWindow Lib "user32" () As Long

Private LastActiveWindow        As Long

Private Sub Form_Load()
    Timer1.Interval = 100
End Sub

Private Sub Timer1_Timer()
    '直前のアクティブなウィンドウを保存
    Dim aw                      As Long
    Dim ctl                     As Control
    
    'アクティブなウィンドウのハンドルを取得
    aw = GetForegroundWindow
    
    'awは自分のウィンドウのハンドルか?
    If aw = Me.hWnd Then Exit Sub
    
    '自分の所有するウィンドウ以外がアクティブになった
    If LastActiveWindow <> aw Then
        LastActiveWindow = aw
        Debug.Print aw
    End If
    
End Sub

…ゴリゴリ書いたので、多分もっと良い方法があると思う&バグあるかも(orz
ノ<ま、参考程度に(TT


Say  2005-04-20 17:32:25  No: 120986

少々話が飛びすぎではないかと。

目下のところ、keybd_eventの使い方の取得のため、
「ボタンを押したら同一Form内のTextBoxにkeybd_eventで文字を流し込む」
処理を書こうとしているところのようですから・・・

基本的には、Focusを持ったControlの履歴を保持します。
同一Form内のControlなら、LostFocus時に自分への参照を
モジュールレベルオブジェクト変数に保持しておき、
Clickイベントでkeybd_eventする直前にその変数のオブジェクトに対し、
Focusをあてればいいでしょう。

ガッ さんの書き込みを参考にするのは、その次の段階でしょう。
(この種のソフトの運用を考えると、
ActiveWindow履歴監視のためにStartUp時にこっそり常駐して
入力時にホットキーなどでActiveになるといった処理も必要でしょう。)


コウ  2005-04-21 07:55:53  No: 120987

ガッさん、Sayさんありがとうございます。(T-T)
上記参考に頑張ってみます。またおって報告します。。。
ありがとうございました。


mimo  2005-04-25 02:51:22  No: 120988

途中、読み飛ばしましたがテンキー(Commandボタン)を押してテキストBOXに表示するだけなら
単純に下のようなことなのでは?

Private Sub Command1_Click(Index As Integer)

    Text1.Text = Text1.Text & Index + 1

End Sub


コウ  2005-04-26 07:43:20  No: 120989

お世話になります。
mimoさんご教授ありがとうございます。

とりあえずですが同一Form内のTextBoxへkeybd_eventを送る事に成功
しました。keybd_eventの直前にText1.SetFocusとしました。次は他
アプリへkeybd_eventを送るコード書いてみようと思います。これから色
々調べてがんばろうと思います。またお世話になる事があるかもしれ
ませんが、厳しくご指導お願いします。良い勉強になりました。
長い間教えて頂いた皆様、ありがとうございました。


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

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






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