
あるアプリがあり、そのハンドルを取得してからメッセージを送るプログラムを作っています。
PageUp,PageDownをそれぞれAlt+P,Alt+Nに変換して送るものです。
関数・定数宣言部は省略しています。
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim hTest As Long
hTest = FindWindow(vbNullString, "Test")
If KeyCode = 33 Then 'PageUp
PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0
PostMessage MPL, WM_KEYDOWN, VK_N, 0
PostMessage MPL, WM_KEYUP, VK_N, 0
PostMessage MPL, WM_SYSKEYUP, VK_ALT, 0
ElseIf KeyCode = 34 Then 'PageDown
PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0
PostMessage MPL, WM_KEYDOWN, VK_P, 0
PostMessage MPL, WM_KEYUP, VK_P, 0
PostMessage MPL, WM_SYSKEYUP, VK_ALT, 0
End If
End Sub
送り先(Test.exe)では、
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim L As String
L = ""
If Shift = 4 Then L = "Alt + "
Label1.Caption = L & KeyCode
End Sub
ラベルで「Alt+P」などが来ているかどうか見ています。こちらのウィンドウで「Alt+P」を押すとちゃんと表示されます。
しかし、この2つを組み合わせるとPのみやNのみしか送られてきません。どこかおかしいのでしょうか。
Alt+PなどをPostMessageで送る方法でよい方法があれば、お教え下さい。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
ALTキーとの組み合わせでしたら、WM_SYSCHARのほうがいいのでは?
たぶん、送り先もVB製でしたら内部でTranslateMessageような感じですし。
あと、
>PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0
MPLってなんですか?
>hTest = FindWindow(vbNullString, "Test")
で取得したウィンドウにPostMessageするんじゃないんですか?
次に、
>Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
KeyDownイベントに処理が書かれてますが、このイベント自体は呼ばれてますか?キー操作を受け付けるコントロールが張り付いてるのにKeyPreviewプロパティがFalseなんてことは無いですか?
#ちなみに、普通はVK_ALTではなくVK_MENUですので。
この回答への補足
回答ありがとうございます。
MPLとは、修正し忘れです。実際のコード内ではMPL.exeを探して処理をしています。
ここに記載する際、Test.exeということにしておくことにしただけです。
修正案として、keybd_eventを使う方法もやってみました。
If KeyCode = 33 Then
Label1.Caption = "PageUp"
SetForegroundWindow (MPL)
keybd_event VK_ALT, MapVirtualKey(VK_ALT, 0), 0, 0
keybd_event vbKeyP, MapVirtualKey(VK_P, 0), 0, 0
keybd_event vbKeyP, MapVirtualKey(VK_P, 0), KEYEVENTF_KEYUP, 0
keybd_event VK_ALT, MapVirtualKey(VK_ALT, 0), KEYEVENTF_KEYUP, 0
FocusSet (Me.hwnd)
SetForegroundWindow (Me.hwnd)
ElseIf KeyCode = 34 Then
Label1.Caption = "PageDown"
SetForegroundWindow (MPL)
keybd_event VK_ALT, MapVirtualKey(VK_ALT, 0), 0, 0
keybd_event vbKeyN, MapVirtualKey(VK_N, 0), 0, 0
keybd_event vbKeyN, MapVirtualKey(VK_N, 0), KEYEVENTF_KEYUP, 0
keybd_event VK_ALT, MapVirtualKey(VK_ALT, 0), KEYEVENTF_KEYUP, 0
FocusSet (Me.hwnd)
SetForegroundWindow (Me.hwnd)
End If
FocusSetとはSetFocus APIのエイリアスです。
これで何とか行きそうだったのですが、PageUpを押すときに「Fn」キーも押さなくてはならず、これによりFn+PageUpが送信されているような気がします。
送信先で
Dim Mes As String
Mes = ""
If Shift = 4 Then Mes = "Alt + "
If KeyCode = LastCode Then
Counter = Counter + 1
Else
Counter = 1
LastCode = 0
End If
Label1.Caption = Mes & KeyCode & vbCrLf & Counter & "回目"
LastCode = KeyCode
のようにして送信された回数をカウントしてみたのですが、Alt+18が何度も表示され(Alt+Altです)、また、
If KeyCode = 18 Then Exit Sub
を追加してもPageUpが押した回数分カウントされませんでした。やはりFnキーが鬼門なのでしょうか。
実際の使用では、プレゼン用のレーザーポインターに付いたボタンによりPageUp,PageDownクリックのみが送信されるので、望み通り行くのかも知れません。
今は実機がないので検証不可能です。
上記のコードに何か不都合がありそうであれば、またご教授下さい。
No.2
- 回答日時:
>SetForegroundWindow (MPL)
これで対象のウィンドウ、最前面に出ますか?
OSによってはタスクバーのところが点滅するだけのはずですけど。
(というか古いOSしか最前面に出ませんが)
>keybd_event VK_ALT, MapVirtualKey(VK_ALT, 0), 0, 0
第2引数になにやら入れてますが、"not use"ですので0でかまわないはずです。これが悪影響を及ぼしてませんかね?
http://msdn.microsoft.com/library/default.asp?ur …
>これで何とか行きそうだったのですが、PageUpを押すときに「Fn」キーも押さなくてはならず、これによりFn+PageUpが送信されているような気がします。
Fnって、ノートパソコンとかでキーの数を減らすためにある特殊なキーのことですよね?これはOSからは見えないので気にしないでいいですよ。
お手数をおかけします。
実際に使うPCで実行してみたら、Altキーは押さなくても良いことが分かりました。
PostMessageでWM_KEYDOWNを送ることによりPやNキーを押すことが出来ました。
今回ご回答いただいた内容は、今後の製作に役立てたいと思います。
ありがとうございました。
ちなみに、
>最前面に出ますか?
は、コードが記載されているフォームをSetWindowPosで最前面にしているので、最前面に来ません。フォーカスも移動しません。
これをやってからkeybd_eventを実行している例文があったので、それを踏襲したので、etForegroundWindowを使っている理由は分かりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) 数式が消える 1 2023/03/19 16:55
- Excel(エクセル) EXCEL マクロで行を挿入して貼り付けようとするとエラーになる。 2 2022/05/24 09:43
- Excel(エクセル) フォルダ内の全ブックのシート名を変更したい 7 2022/09/22 21:34
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- Visual Basic(VBA) vbaの計算 if elseと範囲について 6 2022/11/26 01:49
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) 【VBA】 Alt+PrintScreenにてアクティブウィンドウのスクショを貼付する方法 4 2022/12/08 20:53
このQ&Aを見た人はこんなQ&Aも見ています
-
ウィンドウにキー送信で ENTER を送りたい
Visual Basic(VBA)
-
Ctrl + P のメッセージ送信
Visual Basic(VBA)
-
C言語でwin32apiを使ってnotepadにpostmessageでcontro
C言語・C++・C#
-
-
4
ExcelVBAでスペースキー操作したい
Excel(エクセル)
-
5
非アクティブな画面を操作する方法について
Visual Basic(VBA)
-
6
EnumChildWindowsの使い方(VBA)
Visual Basic(VBA)
-
7
VBA SendMessage 無限ループにどうして無限ループになるんですか
Visual Basic(VBA)
-
8
SendMessage で ESC など
C言語・C++・C#
-
9
SendMessageが失敗するときがある
C言語・C++・C#
-
10
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
11
今更、VBAでRPA、キーボード操作自動化ってどうやるの?
Visual Basic(VBA)
-
12
Excel VBAで他アプリケーションの文字列取得
Excel(エクセル)
-
13
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
14
GetNextWindowがDLLファイルUser32.dll内に見つかりません。
Visual Basic(VBA)
-
15
VBAで、なぜかSendkeyが効きません。
PowerPoint(パワーポイント)
-
16
PostMessageで外部のexeへメッセージを送ったときに不具合が出る
C言語・C++・C#
-
17
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
18
【C#】FindWindowExの使い方を教えてください
その他(プログラミング・Web制作)
-
19
VBA IE操作でダイアログ表示後、ファイルを開くボタンが押下できない
Visual Basic(VBA)
-
20
VBA IE ダウンロード ダイアログ制御(名前を付けて保存)
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
勝手にウィンドウが開いて止ま...
-
検索の画面がでなくなってしま...
-
【VB2008】 マウス操作の一時的...
-
指定ウィンドウのアイコンのキ...
-
「アイテムは収集されました」...
-
focusメソッドを使ってもカーソ...
-
ExcelのBOOKが消えた!
-
WM_PAINT 処理が完了したタイミ...
-
コンボボックスのリストに水平...
-
作成したウインドウのサイズを...
-
VisualC++ サブウインドウの作り方
-
エクセルについて
-
親ウインドウにあるOKボタンを...
-
ゲームでは結局どっちが良いの?
-
UWSCで特定のChromeのタブをア...
-
ウィンドウハンドルって途中で...
-
OutlookでRSSフィードやメモの...
-
VBでアプリケーションを自動操...
-
指定したインアクティブウィン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ラジオボタンの初期指定
-
勝手にウィンドウが開いて止ま...
-
Vba LongPtrについて教えてくだ...
-
検索の画面がでなくなってしま...
-
Excelの上下を固定したい
-
ExcelのBOOKが消えた!
-
[VBA] UserForm を Excel の W...
-
VBA .Value=.Value ?
-
作成したウインドウのサイズを...
-
Console.WriteLine で表示されない
-
エクセルで1行目から3行目が消...
-
「&HFFFF」「&H1A」とは?
-
【VB2008】 マウス操作の一時的...
-
UWSCで特定のChromeのタブをア...
-
他のアプリケーションの終了処理
-
MFCでハンドルを取得するには
-
VBAで単一ブック複数窓を閉じる...
-
EnumChildWindowsの使い方(VBA)
おすすめ情報