VB6でジョイスティックのボタンを押すには?

解決


のん  2009-01-24 18:44:47  No: 101501  IP: 192.*.*.*

VB6を使用してますが、
たとえば、マウスのボタンを押すのにmouse_eventなどがありますが、
ジョイスティックのボタンを押すような方法はありますか?

編集 削除
オショウ  2009-01-26 17:26:27  No: 101502  IP: 192.*.*.*

私はやったことありませんが・・・
ジョイスティック用APIが用意されていますので、
SDK等で探してもられては?

以上。

編集 削除
のん  2009-01-26 18:40:08  No: 101503  IP: 192.*.*.*

オショウさんありがとうございます。
DirectXのDirectInputを使用して、ジョイスティックの情報を
取得することはできるのですが、それを改変できることが
できないかと考えていました。
Aボタンを押したのを認知したらBボタンを押したことにして
送信するなど。
DirectInputでデータを送信するような項目が見つからなくて…。

編集 削除
オショウ  2009-01-26 18:55:32  No: 101504  IP: 192.*.*.*

ええ〜と・・・
JOYSTICKの処理はVB6側で行うのだから、Aボタン押下時
にBボタン処理も呼ぶようにしたらダメなんですか?

WindowsAPI側では処理が遅いと言う記述を見かけました
ので、実用的ではないのでしょう。

※  詳しくなくて申し訳ない〜

以上。

編集 削除
K.J.K.  2009-01-26 19:01:56  No: 101505  IP: 192.*.*.*

joyシリーズのAPIには、そういう機能は無いでしょう。
一般的な HID ドライバには、状態を変化させる機能はありません。

無難且つ汎用性のあるところで、PPJoyなどの仮想ジョイスティック
などを用いるとか。
http://www.geocities.com/deonvdw/Docs/PPJoyMain.htm
これならば、ドライバに状態変化を起こさせるコマンドを DeviceIoControl
で送ることができますので。

編集 削除
のん  2009-01-28 00:44:43  No: 101506  IP: 192.*.*.*

オショウさん、K.J.Kさん どうもありがとうございました。

早速、PPJoyをインストールして、PPJoy自体の動作は確認できたのですが
PPJoyへPostMessageやSendMessageでキー送信してみたのですが
反応してくれませんでした。
PostMessageでWM_CLOSEは受信されたのですが、
WM_CHARやWM_KEYDOWNなどキー送信関係は一切受け付けませんでした。
なかなか難しいです・・・

編集 削除
K.J.K.  2009-01-28 09:59:49  No: 101507  IP: 192.*.*.*

DeviceIoControl で送る、と先の投稿に書きましたよね?

とりあえず、日本語によるC言語でのサンプルは、
http://chihara.naist.jp/people/STAFF/imura/computer/misc/virtual_joystick/disp_content
などにあるようです。

編集 削除
のん  2009-01-28 13:01:05  No: 101508  IP: 192.*.*.*

K.J.Kさん ありがとうございます。そして、すみません。
DeviceIoControlの部分を見落としていて今朝になって
気がついて、色々と検索してみていました。
教えていただいたサンプルもみて、作ってみて
また報告したいと思います。

編集 削除
のん  2009-01-29 00:47:13  No: 101509  IP: 192.*.*.*

教えて頂いたC++のソースをVBに変換してみて、テストしてみましたが、
最初のCreateFileですら動かず悪戦苦闘です。

Const GENERIC_WRITE = &H40000000
Const FILE_SHARE_WRITE = &H2
Const OPEN_EXISTING = 3

Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpCommName As String, ByVal dwDesiredAccess As _
Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal _
dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

Dim h As Long

h = CreateFile("\\.\PPJoyIOCTL1", GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)

これで実行すると h=-1 となります。
試しに "\\\\.\\PPJoyIOCTL1"などもしてみましたが、結果は同じでした。
PPJoyIOCTL1が存在するのか調べる方法などありますか?

編集 削除
K.J.K.  2009-01-29 09:55:07  No: 101510  IP: 192.*.*.*

まず、Err.LastDllErro の値を調べて、エラーの原因を特定しましょう。

デバイスがないとされているのであれば、
コントロールパネルでの設定はどうなっているのでしょうか。

デバイスがあるとされているのであれば、"\\.\PPJoyIOCTL1"に自信が
無いのならば、"\\.\PPJoyIOCTL1"から"\\.\PPJoyIOCTL16"まで、
試しに開いてみて、それのうちのどれが有効な値を示すのかを力ずくで
調べる、ということもできますし。

なお、公式の最新サンプルは
http://www.geocities.com/deonvdw/Docs/PPJoyMain.htm
http://www.geocities.com/deonvdw/Docs/Diagrams/Virtual/IOCTL.htm
などにあります。(英語版)

というより、VBからの使用サンプルもあったような。

編集 削除
のん  2009-01-29 22:04:25  No: 101511  IP: 192.*.*.*

Err.LastDllErrorの値は87でした。
パラメータがおかしいらしいのですが、調べてもわかりませんでした。

コントロールパネルではPPJoyで作成したジョイパッドは表示されています。

デバイスを1〜16まで試してみましたけど、全部-1が戻ってきます。

これ以上は私の知識では無理そうなのであきらめます。

オショウさん、K.J.Kさん ご丁寧に教えて頂きありがとうございました。

編集 削除
K.J.K.  2009-01-30 13:53:09  No: 101512  IP: 192.*.*.*

パラメータがおかしい、ですか。
となると、デバイスの名前かアクセスモードか共有モードか、辺りでしょうか。
とりあえず、名前でないとして、
アクセスモードに
GENERIC_READ Or GENERIC_WRITE
共有モードで
FILE_SHARE_READ Or FILE_SHARE_WRITE
を指定してみるとどうなります?

編集 削除
のん  2009-01-31 01:50:26  No: 101513  IP: 192.*.*.*

K.J.Kさん ありがとうございます。

アクセスモード、共有モードともに指定してみましたが、
結果は変わりませんでした。
PPJoyに直接送信はあきらめて、今度はPPJoyKeyに
キーストロークを送れないかなど、挑戦しています。
できていませんが・・・。

なかなか難しいですね。
お忙しいなか、ご教授ありがとうございました。

編集 削除