バックグラウンドでメッセージを取得するには?

解決


yoshi  2005-11-25 19:11:28  No: 59809  IP: 192.*.*.*

起動した瞬間タスクトレイに収納し、メッセージ(ゲームコントローラの)を待ち続けるプログラムが組みたいのですが、どうすればよいのでしょうか?
タスクトレイに収納する際にバックグラウンドでメッセージを待つようにする命令があると噂で聞いたのですが、調べても分かりませんでした。

バックグラウンドでメッセージを取得する為の方法を教えていただけませんでしょうか?

編集 削除
dairygoods  2005-11-28 09:38:37  No: 59810  IP: 192.*.*.*

マルチタスクOSでは、最前面のアプリケーション以外は、
皆バックグラウンドで動いています。

なので、普通にアプリケーションを作ればよいです。

ウィンドウを出したくないという話でしたら、
ShowWindow で消します。

編集 削除
yoshi  2005-11-28 15:31:44  No: 59811  IP: 192.*.*.*

えっと、そのメッセージを取得して、何かプログラムが動くようにしたいんです。
タスクトレイで入力を待っていて、例えばゲームコントローラの右キーを押すとウインドウが開く、左キーを押せばそのウインドウが消える、のようなプログラムを作成したいのです。

SetCooperativeLevel(hwnd,DISCL_EXCLUSIVE | DISCL_BACKGROUND);
でバックグラウンドでメッセージを取るようになると書いてあったのですが、全然動いてくれません。
助言お願いします^^;

編集 削除
PATIO  2005-11-28 17:14:42  No: 59812  IP: 192.*.*.*

多分、DirectInputを使ってますよね。
MSDNでSetCooperativeLevelを引くとDirectX系のところで引っかかります。
こういうライブラリを使っている場合は明示的に使っていますと
書いた方が話が早いと思います。

DirectInputの説明を読む限りでは、自分で周期的にジョイスティックの
状態を取得に行かないといけないように書いてありますが、
ジョイスティックに入力があると何かウインドウに通知が来るんですかねぇ?
DirectInputを使ったことが無いので良く分かりませんけれど、
ライブラリの使い方そのものが間違っていると言うことはありませんか?

編集 削除
yoshi  2005-11-28 19:09:38  No: 59813  IP: 192.*.*.*

はい、DirextInputを使用しています。
今のところ、アクティブになっている場合に次のような事ができるようになっています。

コントロールパネルの、「ゲームコントローラ」を実行した時に見れるような画面が開き、
「電車でGoコントローラ」を動かすと点がx軸・y軸に動くようなプログラムが動いています。

非アクティブにするとまったく動かない状態です・・・

編集 削除
Ryo  2005-11-29 08:46:38  No: 59814  IP: 192.*.*.*

VCやDirectXのバージョンなどの開発環境
および、協調レベルを決定するまでの過程のソースをあげみてはどうでしょうか?

それとSetCooperativeLevelの戻り値はどうなっているのかとかも
(関数が失敗なのか、関数は成功してるのに実現していないのか・・・など)

編集 削除
PATIO  2005-11-29 10:54:27  No: 59815  IP: 192.*.*.*

Ryoさんの言われている通り、開示されている情報が少なすぎます。
少なくとも開発環境に関してはきちんと提示してください。
開発環境によってアドバイスの内容が変わる事もありえます。

あと、必要なソースの定時もお忘れなく。
必要な箇所をうまく抜粋して提示できればベストですが、
判断が付かなければ、関連の部分をまとめて載せた方が話が早い場合も多いです。

編集 削除
PATIO  2005-11-29 10:55:19  No: 59816  IP: 192.*.*.*

がーん。

定時ではなくて提示ですね。
誤字失礼。

編集 削除
yoshi  2005-11-29 16:42:21  No: 59817  IP: 192.*.*.*

開発環境は、Microsoft Visual Studio .NET 2003で、DirectX9です。
ソースは
http://www.geocities.co.jp/SiliconValley-Oakland/9582/GamePrg/prg04.htm
ここにあるサンプルソースをいじっているのですが、ほとんど知識のない状態でやっていて・・・(.netもDirectXも初めて使います)
とりあえずSetCooperativeLevelと書かれている部分を全てBACKGROUNDに変更しただけです。
その状態で非アクティブにすると動かない、という状況です。

編集 削除
気分屋  2005-11-29 17:14:46  No: 59818  IP: 192.*.*.*

WM_ACTIVATE時にUnacquireメソッドを使用して
アクセス権を開放しているのが問題なのでは?

編集 削除
PATIO  2005-11-29 17:31:04  No: 59819  IP: 192.*.*.*

確認すべき事。

まず、サンプルソースの中でWinMainとMyWindowProcのメッセージの流れは理解できていますか?
サンプルソース中でジョイスティックのセンスを行っている部分がありますが、
その場所は理解できていますか?

状態が取れていないのと画面に描画できないのは別の問題かもしれないと考えましょう。
まずはジョイスティックからのステータスが取れているかどうかの確認からしましょう。
次に取れているのであれば、なぜ描画できないのかを調べましょう。

いずれにしても基本的なWindowsの処理の流れとウインドウメッセージの流れを理解していないと
単にジョイスティックの部分の制御だけを何とかしようとしても駄目です。

編集 削除
PATIO  2005-11-29 17:33:29  No: 59820  IP: 192.*.*.*

多分、気分屋さんがビンゴですね。
WM_ACTIVATE時にウインドウが非アクティブになったらUnacquireを呼ぶような記述がありますね。
CDInputも合わせて見ないと分かりませんけれど。

編集 削除
yoshi  2005-12-05 23:55:49  No: 59821  IP: 192.*.*.*

アクティブな状態でどうとか、その変のプログラムをいじってみたらうまくいきました!!
ありがとうございます!!

毎回質問させていただいて思うんですけれども・・・
皆さんすごいですね(;´△`)
自分もいつかは答えれる立場に・・・!!(笑

編集 削除