アプリ版:「スタンプのみでお礼する」機能のリリースについて

ゲームコントローラに対応していないソフトウェアを、コントローラに対応させるべくプログラムを組んでいます。
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;

こんな感じで投げられるかな?と思ったのですが、悲しいほど無反応。
なにか根本的にやり方を間違えているのでしょうか・・・?

A 回答 (2件)

コードを試しました。

WindowハンドルをAddObjectで記憶していますので下記は修正しました。

【修正前】PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
【修正後】PostMessage(hwnd(listbox1.Items.Objects[i]), WM_KEYDOWN, {入力キー名} 48, 0);

この修正を加えたら、秀丸エディタには文字0を入力できました。しかし、メモ帳やワードパッドには入力できませんでした。

ウィンドウとメッセージについて調べて試す必要があると思います。EnumWindowsはトップレベルのウィンドウしか探しません。目的のアプリケーションがトップレベルのウィンドウにWM_KEYDOWNを送って反応するものかどうか。子ウィンドウあるいは別のメッセージにしたらどうか、フォーカスをあてたらどうか、など。
    • good
    • 0

追加です。

ウィンドウを前面にしてキー操作を一つ一つ送ってみてはどうでしょうか。メモ帳やワードパッドにも入力できました。

【変更前】
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);
    • good
    • 1
この回答へのお礼

遅くなってすみません。ご指摘の通りObjectsで取り出したら正常にキー入力を送ることができました(基本的なところでしたね)。
トップレベルで運良く反応してくれたため、これをベースに実装していきたいと思います。ありがとうございました!

お礼日時:2006/09/30 20:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!