[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/06/28(Thu) 00:13
投稿者名:みなな
Eメール:
URL :
タイトル:
ゲームにキーを送る
最近、他のウィンドウにキーを送るプログラムを作成したのですが、
ゲームなどの一部のウィンドウにキーが送れないことに気がつきました。。

Vectorなどで公開されているソフトではゲームにもキーが送られているのですが
どうやって送っているのでしょうか?
APIのkeybd_event、sendInput、PostMessageのWM_KeyDown、
VBのsendkeyコマンドなどを試したのですがキーが送られませんでした。

ちなみにkeybd_eventは以下のように書いています。
Call keybd_event(VK_Z, MapVirtualKey(VK_Z, 0), KEYEVENTF_EXTENDEDKEY Or 0, 0)

ご存知の方いらっしゃいましたら教えてください。
よろしくお願いします。

投稿時間:2007/06/29(Fri) 06:57
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: ゲームにキーを送る
> ゲームなどの一部のウィンドウにキーが送れないことに気がつきました。。

> ちなみにkeybd_eventは以下のように書いています。
> Call keybd_event(VK_Z, MapVirtualKey(VK_Z, 0), KEYEVENTF_EXTENDEDKEY Or 0, 0)


まず、「一部のウィンドウにキーが送れない」 のなら送れるウィンドウと送れない
ウィンドウの違いを調べないと、ハンドルが取得できているかどうかとか?
又は、そのゲームの画面を止めた状態では(メニュー画面等)送れるとか

ウィンドウにキーが送れない 状況でプログラムを順番に追ってどこまで正常に
動いているのかをデバッグして見て下さい。

これだけの状況では、大抵の人は答えられないと思いますよ。
ウィンドウにキーが送れない 場合の具体的な事象を見ている人が再現できる
ようにでもしないと。
せめて、送れるソフトと送れないソフト名を誰でもが知っているソフト名を例にあげて
頂くとか、私は、ゲームなって殆どしないので、ゲームを例に上げてもらっても....。

 

投稿時間:2007/06/30(Sat) 01:01
投稿者名:みなな
Eメール:
URL :
タイトル:
Re^2: ゲームにキーを送る
花ちゃん 様

お返事ありがとうございます。
特にkeybd_eventなどのキーを送る処理までは正常な動作をしております。
ハンドルは取得できてまして、sendmessage、postmessageでキーを送っても
反応はありませんでした。しかし戻り値は1でした。
子ウィンドウもなさそうです。

ゲームは私もほとんどしないので、例をあげるのも難しいです。。
現在試しているのは「洞窟物語」というフリーのゲームです。

何か他にキーを送る方法がないかと思いまして、投稿させていただいたのですが、
申し訳ありませんでした。

投稿時間:2007/06/30(Sat) 09:42
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
回答にあらず
> 最近、他のウィンドウにキーを送るプログラムを作成したのですが、
> ゲームなどの一部のウィンドウにキーが送れないことに気がつきました。。

DirectInput を使用している相手なら、SendInput かな。keybd_event だと駄目かも。

ゲーム相手にではなく、実験用に以下のような DirectX アプリを作成してみて、
そこに対して、期待する結果を送出できるかどうかを調べてみる、とか。

'=======
Option Explicit

Private mDX As DxVBLibA.DirectX8
Private mDI As DxVBLibA.DirectInput8
Private mDIDevKeyboard As DxVBLibA.DirectInputDevice8
Private mhEventKeyboard As Long
Implements DxVBLibA.DirectXEvent8

Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)
    If eventid <> mhEventKeyboard Then
        Exit Sub
    End If
            
    Dim keyState As DIKEYBOARDSTATE
    mDIDevKeyboard.GetDeviceStateKeyboard keyState
    Dim keyMsg As String
    keyMsg = ""
    Dim n As Integer
    For n = 0 To 255
        If keyState.Key(n) And &H80 Then
            keyMsg = keyMsg & " " & Right("00" + Hex(n), 2)
        End If
    Next
    If keyMsg <> "" Then
        List1.AddItem "KeyDown" & keyMsg, 0
    End If
End Sub

Private Sub Form_Load()
    Caption = "キー入力監視"
    Set mDX = New DxVBLibA.DirectX8
    Set mDI = mDX.DirectInputCreate()
    Set mDIDevKeyboard = mDI.CreateDevice("GUID_SysKeyboard")
    mDIDevKeyboard.SetCommonDataFormat DIFORMAT_KEYBOARD
    mDIDevKeyboard.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
    mhEventKeyboard = mDX.CreateEvent(Me)
    mDIDevKeyboard.SetEventNotification mhEventKeyboard
    mDIDevKeyboard.Acquire
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    mDIDevKeyboard.Unacquire
End Sub
'=======


> Vectorなどで公開されているソフトではゲームにもキーが送られているのですが
> どうやって送っているのでしょうか?

作者に聞いてみては如何でしょう。

投稿時間:2007/07/01(Sun) 02:33
投稿者名:みなな
Eメール:
URL :
タイトル:
Re: 回答にあらず
魔界の仮面弁士 様

いつもお世話になってます!
ソースまで書いていただいてありがとうございます。

DirectInputでキーの入力を取得をしてるんですよね?
keybd_eventではZキーを送ったのですが"KeyDown 00"となり正常に送られていませんでした。
SendInput では正常にキーを送れました。

しかしゲームには SendInput ではキーを送れませんでした。。
一度作者様に尋ねてみようかと思います。

魔界の仮面弁士様のおかげでDirectXのアプリにはキーを送れるようになりました!ありがとうございました!!