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

解決


のん  2009-01-25 03:44:47  No: 101501

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


オショウ  2009-01-27 02:26:27  No: 101502

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

以上。


のん  2009-01-27 03:40:08  No: 101503

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


オショウ  2009-01-27 03:55:32  No: 101504

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

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

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

以上。


K.J.K.  2009-01-27 04:01:56  No: 101505

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

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


のん  2009-01-28 09:44:43  No: 101506

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

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


K.J.K.  2009-01-28 18:59:49  No: 101507

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

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


のん  2009-01-28 22:01:05  No: 101508

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


のん  2009-01-29 09:47:13  No: 101509

教えて頂いた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 18:55:07  No: 101510

まず、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-30 07:04:25  No: 101511

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

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

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

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

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


K.J.K.  2009-01-30 22:53:09  No: 101512

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


のん  2009-01-31 10:50:26  No: 101513

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加