• ベストアンサー

フォームの内容をリフレッシュするには?

AとBという2つのEXEがあるとします。(共にVBで作成) 通常は、A.EXEからB.EXEをCALLし、Bを起動するということをしています。 ここまでは簡単なのですが、更に次のような処理を加えたいのです。 A.EXE → B.EXEでBを起動。但し、Bが既に起動されている場合、Bのフォームをリフレッシュする。 このようなことは容易でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.6

2重起動の時に、参考URLの処理をやったらいいだけデシ もちろん、標準モジュールから立ち上がるようにするベシ '標準モジュール Option Explicit Public Const CAP_FORM  As String = "ぱけらった" Public Const CAP_BTN  As String = "ほげほげ" Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const WM_COMMAND = &H111 Private Const BN_CLICKED = &H0& Sub Main()   If App.PrevInstance Then     Call func二重起動     End   End If   Form1.Show End Sub Sub func二重起動()   Dim lngWindWnd As Long   Dim lngBtnWnd  As Long       lngWindWnd = FindWindow(vbNullString, CAP_FORM)   lngBtnWnd = FindWindowEx(lngWindWnd, 0, vbNullString, CAP_BTN)      Call PostMessage(lngWindWnd, WM_COMMAND, BN_CLICKED, ByVal lngBtnWnd) End Sub 'フォームモジュール Option Explicit Private Sub Command1_Click()   MsgBox "フォームのボタンが押下された" End Sub Private Sub Form_Load()   Me.Caption = CAP_FORM   Me.Command1.Caption = CAP_BTN   Me.Command1.Visible = False End Sub

akikan0125
質問者

お礼

App.PrevInstanceをつかって実現できればなぁと思っていたのですが、こうすればよかったんですね! ありがとうございました!おかげで中間EXEをかます必要がなくなりました。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.5

B側に実装する手もあります 'B.EXEのMain Public sub Main() If (App.PrevInstance) Then '起動済みなら 起動済みのフォームのウィンドウハンドルを取得 メッセージを投げる 終了 Else スタートフォームを表示 End if End Sub

akikan0125
質問者

お礼

シンプルな回答ですが、とてもわかりやすいです! ありがとうございました!

すると、全ての回答が全文表示されます。
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.4

なぜBAT? EXEじゃないの? とりあえず、起動中のEXEはFindWindowやEnumWindow系か http://oshiete1.goo.ne.jp/kotaeru.php3?q=558701 で見つけるがヨシ それでスレッドIDやウィンドウハンドルを取得して、FindWindowExを使ってB.EXEから「再取得」ボタンのウィンドウハンドルを取得する。 んでもってポストするべし。

akikan0125
質問者

補足

様々な情報、ありがとうございます。 AというEXEが起動している状態で、もう一度AというEXEを起動した場合、最初にあがっていたEXEをリフレッシュしたかったのです。 ただ、きっとこれは無理だろうなぁと思い、間にもう一つEXEをかませれば何とかならないかと思った次第です。

すると、全ての回答が全文表示されます。
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

UpdateWindowとか

akikan0125
質問者

補足

APIを使ってリフレッシュするんですね? ちょっと私の説明不足でした。 既にEXEが起動されている場合は、ある処理(データアクセス)を行ってその内容を表示するということを行いたいのが、可能でしょうか?

すると、全ての回答が全文表示されます。
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.2

B.EXEに見えないコマンドボタンを用意しておいたらいい http://oshiete1.goo.ne.jp/kotaeru.php3?q=199357 TCP/IPでの通信を連携取ってもよし http://oshiete1.goo.ne.jp/kotaeru.php3?q=155606

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=199357,http://oshiete1.goo.ne.jp/kotaeru.php3?q=155606
akikan0125
質問者

補足

早速のレス、ありがとうございます。 WinSockやOLEを使った方法は自分でも試していたのですが、199357の方法は初めて知りました。 あるEXEから別のEXEをCALLして制御することが出来るといことがわかり、大変助かりました。 便乗して申し訳ないのですが、以下のようなことは可能でしょうか?  ・A.EXE → B.EXEのあるフォームをリフレッシュ(可能)  ・C.BAT → B.EXEのあるフォームをリフレッシュ(既に起動している場合のみ)

すると、全ての回答が全文表示されます。
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

>このようなことは容易でしょうか? 難しいでしょう。 DDEに対応しているならば、クリアすることも可能ですが・・・。 起動してたら、いったん、終了させて 再度、起動させればいいのでしょうけど。

すると、全ての回答が全文表示されます。

関連するQ&A