• 締切済み

多重起動での同期動作

よろしくお願いします。 VB2005にて開発していますが、アプリケーションを場合によって多重起動し、ボタンのクリックなどを同期的に発生させたいと考えています。 つまり、どれか一つのボタンを押すと、他の分身たちも同じクリックイベントが発生する。といった事です。 VB WH_KEYBOARD_LL や PostMessage などで色々やっては見たのですが、どうも思ったような動作をしません。 「それは無理だ」とか、「#$%%&で出来るだろ?」みたいなアドバイスだけでも戴けると有難いです。

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

私はマルチプロセスの同期や指令にSendMessageを使っています。 ターゲットのウィンドウは非表示にして、誤操作を防いでいます。 この方法はウィンドウのサブクラス化ができるスペックと、 メッセージを送り込むウィンドウのハンドルをどう受け渡すかが ポイントになります。 何故かPostMessageだと上手くいかないんですよね。なので、 サブクラス化したプロシージャではタイマを仕掛けて、直ぐに 処理を終わります。タイムアップの所で本来の処理をするように しています。 ウィンドウハンドルは先ず親プロセスが子プロセスを起動する時に 親のウィンドウのハンドルをコマンドラインで渡します。 子プロセスは自ウィンドウのハンドルを親ウィンドウに伝えます。 これで、相互に通話(?)可能になります。 後、継承可能にしたミューテックスを使って、資源の競合を制御 したりすることも必要かも知れません。

mute_sky
質問者

お礼

nda23さま、ご助言有難うございました。 そうですか、PostMessageで上手くなかったですか... SendMessageだと、一旦子プロセスをアクティブにするのですよね? ん? 「ターゲットのウィンドウは非表示に」ですか。知識不足で分って いませんが、そういった方法があるんだ。という目で調べてみます。 でも、ハンドルのコマンドライン渡しとか、私にはハードル高いかなぁ。(汗) 状況によって、多重起動が6プロセスにもなるので、出来るだけ軽い 実装をしたいと思っています。 重ねて有難うございました。また何かありましたら宜しくお願い致します。

関連するQ&A

  • VB.NETで起動させたExcelの多重起動を禁止させるには?

    VB.NETで起動させたExcelの多重起動を禁止させるには? [前提条件] VB.NETには、「Excelを起動させるボタン」と「Excelを終了させるボタン」があるとします。 「Excelを起動させるボタン」によって既存のExcelファイルを起動させ、 「Excelを終了させるボタン」によって起動中のExcelファイルを終了させたいと思います。 Excelを起動している最中は、VBとExcelとでデータの受け渡しをします。 [問題・課題] この方法ですと、「Excelを起動させるボタン」を押下するたびに、同じ既存のExcelファイルを多重起動されてしまいます。 ネット上にある参考文献を調べると、ひとつの関数(?)内で アプリケーション open ⇒ データの吸出し  ⇒ アプリケーション close となっていました。 [前提条件]で述べている使い方で、実現可能な方法があれば教えてください。 (参考になりそうなWebアドレスだけでも構いません) 以上、よろしくお願いします。

  • VB.NET開発(イベントプロシージャはマルチスレッドですか?)

    VB.NET開発(イベントプロシージャはマルチスレッドですか?) 以前より.NETのWindowsフォームの業務アプリ開発してますが、基本的な質問をさせて下さい。 イベントプロシージャの実行処理は、本体スレッド(実行時のスレッド)とは別のスレッドで動作しているのでしょうか。 例えば、ボタンのクリックイベントに何かしらの重い処理があったとします。このクリックイベントの処理ではボタンの制御をしていないので、イベントプロシージャの実行中は、処理中のボタンが押下可能な前提とします。この時、このボタンを3回押下して実行させると3つのスレッドが新規に作成されて実行していると考えて宜しいのでしょうか。 デリゲートやイベントに関するキーワードで検索して、いくつか資料を見たのですが、上記の疑問にぴったり合う解答がなく、質問させて頂きました。 業務アプリの開発で、今まで、あまりマルチスレッドなど意識せずやってきましたが、実は意識しなくても、マルチスレッドの開発をしていたことになるのでしょうか。 以前、VB6の開発もしておりました。 ちなみにVB6の場合も、イベントプロシージャはマルチスレッドで実行されていると考えて宜しいのでしょうか。 よろしくお願いします

  • OCX (ACTIVEX)で非表示にするとハンドルが取れない

    MSVC++(MFC)を使用して、OCXモジュールを開発しています。 VBデザイン時に Visibleプロパティがtrueの場合でも 実行時には非表示になるようしたいと思っています。 非表示にするために、「コントロールの型情報の制御」のところで、 ******に OLEMISC_INVISIBLEATRUNTIME を追加すると、 実行時に非表示になり、要件は満たすのですが、 この場合、GetSafeHwnd()の返却値がNULLとなってしまい、 イベント発生時のPostMessage()が出来なくなってしまいます。 OCXを非表示にでき、PostMessage()が成功するようにするには どのようにしたら良いかをご存知でしたら教えてください。 なお、WINDOWS 95からXPまで全ての環境での動作を考えています。

  • 『動作中』の表記

    VB2010にてシステム構築しています。 あるボタンでさせる作業が結構長く『動作中』がみんなにわかるように 処理ボタンを押したらそのボタンのTextを赤字で『動作中』としたいのですがどうしたらいいですか? 普通にButton.ClickのSUB内にコードを書いても動かないので別のものを使用しないといけないんですかね? よろしくお願いします

  • VBでwindowsスタートメニュー動作

    VB(現状はVB6.0)にてWindowsのスタートメニューのような動作をさせたいと思っています。 <実現したい内容> あるボタンを押すとその配下が出力され、ある項目へカーソルを持っていくとその配下が出力され、 クリックするとそれに見合った処理がなされる。 上記の項目名はデーターベースから出力し、クリックされた項目の戻り値を取得し、その後の処理を実施する。 上記のようなアプリケーションをVBにて作成することは可能でしょうか? 可能であればどのようにすればよいか教えていただきたいと思います。 宜しくお願いします。

  • デスクトップで起動できて、ノートでは起動できません

    こんにちは、どなたかわかる方、ご教授お願いします。 ※別のスレッドにもこの内容を書かせていただいたのですが、切り分けてこちらで改めて立たせていただきます。 VB2008 Access2010 Win7デスクトップPC(32bit)で開発 開発の最終段階まできたのですが、昨日突然以下のようなエラーメッセージが出るようになり、まったく起動しなくなってしまいました。 ※デスクトップ(32bit)では問題なく起動、動作を確認しましたが、ノート(32bit)ではエラーとなりました。 以下にエラー内容を載せますので、解決方法をご教授いただけないでしょうか。 よろしくお願いします。 --------------------------------------------------------------------------- Microsoft .NET Framework アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。[続行]をクリックすると、アプリケーションはこのエラーを無視し、続行しようとします。[終了]をクリックすると、アプリケーションは直ちに終了します。 型'ADODB.ConnectionClass'のCOMオブジェクトをインターフェイス型'ADODB.ConnectionClass'にキャストできません。IID '{00001550-0000-0010-8000-00AA006D2EA4}'が指定されたインターフェイスのCOMコンポーネント上でのQueryInterface呼び出しのときに次のエラーが発生したため、この操作に失敗しました。インターフェイスがサポートされていません(HRESULTからの例外:0x80004002(E_NOINTERFACE)) --------------------------------------------------------------------------- よろしくお願いします。

  • VB.NETでマウスクリックイベントを発生させたい。

    VB.NETでformの外で任意の座標でマウスクリックイベントを発生させたい。 formにはボタンがあり、そのボタンを押すを固定位置(formの外)でマウスの左クリックイベントを発生させたいのですがどのような手段を使えばいいでしょうか。 環境 Windows XP,VB2008 Exoress

  • VB.NETでのイベントの途中終了

    VB.NETで、あるボタン(button1)をクリックさせた際にイベントを発生させます。 そのイベント内の処理途中で、イベントを終了させたいと思っていますが、どのように書いていいかわからず困っています。 どなたかおわかりの方お願いします。

  • accessで ラベルをクリックしたときにコマンドボタンのような動作をさせたいのです。

    こんにちは。よろしくお願いします。m(__)m アクセスのフォームに、コマンドボタンを貼り付けて、クリック時にいろいろな動作を設定しているのですが、コマンドボタンには色をつけられないので、なんだか味気ないのです。 それで、ラベルを使うと色もつけられるし、クリック時のイベントプロシージャーも使えるし、便利だよと教えてもらったのですが、クリックしても、したのかどうか、わからないので、頼りないのです。 そこで、マウスボタンクリック時と、解放時のイベントプロシージャーを設定してやるといいよときいて、そうかぁ、なるほどぉ!! と思い、やってみようとしているのですが、どのように設定したらいいのか、さっぱりわかりません。 クリックしたときに、コマンドボタンのような動作をさせるには、どのように設定したらいいのか、教えていただけるとうれしいです。 よろしくお願いします。

  • ボタンをマウスで押し続けたときのイベント

    VB2005,Frameworks2を使用しています。 フォームに設置したButtonは、通常マウスをクリックする度にイベントが発生しますが、これをボタンをマウスで押している間だけイベントを発生されたいのですがその様なイベントやボタンの設定が見つかりません。 やはりタイマー等を使わないと再現できないのでしょうか? よろしくお願いします。

専門家に質問してみよう