
ゲームコントローラに対応していないソフトウェアを、コントローラに対応させるべくプログラムを組んでいます。
Delphiのプログラムでコントローラからの入力を受け取り、該当するウインドウにメッセージを送信すればこの仕組みが実現できると考えたのです。
まず、以下の関数を記述しました。
function CallBackTest(WH: HWND; LP: LParam): BOOL stdcall;
var
Buff: array [0..255] of Char;
begin
if IsWindowVisible(WH) then
if GetWindowText(WH, Buff, 255) <> 0 then
TListBox(LP).Items.AddObject(Buff, Pointer(WH));
Result := True;
end;
次に、ListBoxを用意して、以下を実行しました。
EnumWindows(@CallBackTest, Longint(ListBox1));
ListBoxには実行中のウインドウタイトルが表示されます。そこで、目的のウインドウ名を選択して
for i := 0 to (ListBox1.Items.Count - 1) do
if ListBox1.Selected[i] then
PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
end;
こんな感じで投げられるかな?と思ったのですが、悲しいほど無反応。
なにか根本的にやり方を間違えているのでしょうか・・・?
No.1ベストアンサー
- 回答日時:
コードを試しました。
WindowハンドルをAddObjectで記憶していますので下記は修正しました。【修正前】PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
【修正後】PostMessage(hwnd(listbox1.Items.Objects[i]), WM_KEYDOWN, {入力キー名} 48, 0);
この修正を加えたら、秀丸エディタには文字0を入力できました。しかし、メモ帳やワードパッドには入力できませんでした。
ウィンドウとメッセージについて調べて試す必要があると思います。EnumWindowsはトップレベルのウィンドウしか探しません。目的のアプリケーションがトップレベルのウィンドウにWM_KEYDOWNを送って反応するものかどうか。子ウィンドウあるいは別のメッセージにしたらどうか、フォーカスをあてたらどうか、など。
No.2
- 回答日時:
追加です。
ウィンドウを前面にしてキー操作を一つ一つ送ってみてはどうでしょうか。メモ帳やワードパッドにも入力できました。【変更前】
PostMessage(hwnd(listbox1.Items.Objects[i]), WM_KEYDOWN, {入力キー名} 48, 0);
【変更後】
var Key: Word;
SetForegroundWindow(hwnd(listbox1.Items.Objects[i]));
Key := VkKeyScan('0');
keybd_event(LoByte(Key), 0, 0, 0); // 文字0
keybd_event(LoByte(Key), 0, KEYEVENTF_KEYUP, 0);
Key := VkKeyScan('a');
keybd_event(LoByte(Key), 0, 0, 0); // 文字a
keybd_event(LoByte(Key), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, 0, 0); // shiftキー
keybd_event(LoByte(Key), 0, 0, 0); // 文字A
keybd_event(LoByte(Key), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
遅くなってすみません。ご指摘の通りObjectsで取り出したら正常にキー入力を送ることができました(基本的なところでしたね)。
トップレベルで運良く反応してくれたため、これをベースに実装していきたいと思います。ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 指定の条件に応じたセルの場所に〇印(図形)を描く 2 2022/11/08 15:26
- Visual Basic(VBA) vba GetAsyncKeyState関数について 1 2023/08/24 12:08
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
(VBA)チェックボックスのclick...
-
Visual Basic 6.0 コンボボック...
-
【Mouse Down】キーリピートを...
-
自作ダイアログボックス中のエ...
-
EXCEL VBA----ユーザーフォーム...
-
ASP.Net BeforeUpDate のように
-
プログラミングc# Windowsフォ...
-
SelectionChangeCommitted
-
KEYPREVIEW=TRUEについて。意味...
-
keypress
-
VB.NETでフォームがない...
-
「ご処理進めて頂きますようお...
-
VBAでループ内で使う変数名を可...
-
エクセルで、日付を入力すると...
-
エクセルVBAで、MsgBox やInput...
-
Excelシート上のマクロを登録し...
-
男性に対して、『女性への気遣...
-
UPS警告音を止めたい
-
【Excel】特定の文字を含むセル...
-
Googleフォーム・複数人の申し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VB】タブ切り替え時のイベント
-
タブキー押下時のイベントをひ...
-
(VBA)チェックボックスのclick...
-
VB.NETでフォームがない...
-
特定のキーを押すまでループさ...
-
一定時間操作されないと自動で...
-
コンボボックスにキー入力をさ...
-
Visual Basic 6.0 コンボボック...
-
VB.NETのDropDownListをReadOnl...
-
WPFでの時刻入力コントロールに...
-
KEYPREVIEW=TRUEについて。意味...
-
Excel VBA マクロ実行中のみテンキ...
-
フォーカスについてお教えください
-
エクセルVBAのテキストボック、...
-
DirectXのDIK発進について
-
Enterキー入力後の動作について
-
C# WMPメディアの終了検知 その2
-
Delphiでキー入力を投げたい
-
キーイベントを擬似的に発生さ...
-
DephiでのTextボックスでの数値...
おすすめ情報