• ベストアンサー

プログラムをアクティブにしないようにするにはどうするのですか?

a.exeを起動したら Aの中でshellでb.exeが起動する a.exeの上にb.exeが起動しているかたちになります。 このときにa.exeの画面をクリックしても a.exeはアクティブにならずにしたいのですがどうすればよいのか 襲えてください。 a.exeはフォームにbmpをはり各プログラムの背景画面にしたいので クリックされてもなにを反応しないようにしたいのです。 よろしくお願いします。

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

サンプル作りました。 さっきの書き込みのとき、しっかり読まなかったので、勘違いして回答を書いております。 それで処理内容がさっきと発言と変わっています。 サンプルでは、背景にもコマンドボタンを置いて、別のEXEを操作していますが、必要のない機能ははずしてください。 処理内容を説明します。 1.Aを起動します。 2.AからSHELLでBを起動します。 3.Bの中の処理はフォームをロードするだけで、Showを行いません。 4.Aの中にBを埋め込みます。 5.AからBの表示位置を設定します。 6.AはBを常に監視します。 以上がおおまかな流れです。 サンプルを実行するときの注意点です。 二つのEXEが必要です。 A.exeについて  必要なもの  フォーム  コマンドボタン1/2/3  標準モジュール A.exeの名前については任意です。 もうひとつのEXEの名前はB.exeにしています。(定数でCHILD_EXEの内容を変えることで、変更できます) B.exeの表示位置をピクセル単位で指定しています。[CHILD_X/CHILD_Y]が、それにあたります。サンプルでは[300,0]に設定してます。それにともない、フォームは多少大きめに、3つのコマンドボタンはふ、フォームの左端がわに縦に並ぶように配置してください。 B.exeについて  必要なもの  フォーム  標準モジュール こちらはフォームから起動しないで、標準モジュールから実行するようにしてください。 コードを見てもらえたらわかるように、フォームをロードするだけです。 フォームのキャプションを空にして、BorderStyleを[0-なし]にしてあげると、より一層別のEXEだということが感じられなくなります。 -----A.EXEのフォーム(ここから)----- Option Explicit '別EXEのファイルパス Private Const CHILD_EXE As String = "b.exe" '別EXEの表示位置X座標 Private Const CHILD_X  As Long = 300 '別EXEの表示位置Y座標 Private Const CHILD_Y  As Long = 0 'アプリケーションの終了ボタンを押されたときの処理フラグ Private bytFlg   As Byte 'bytFlgは基本的に0で、アプリケーションの終了時に0をセット Private Sub Command1_Click()   '初期化を行う   FindWinWnd = 0   FindPrs = 0   'とりあえずCHILD_EXEを起動と同時に、電卓のプロセスを得る   FindPrs = Shell(CHILD_EXE)     'プロセス=0のとき起動失敗   If FindPrs = 0 Then     MsgBox CHILD_EXE & "の起動失敗"     GoTo PGMEND   End If     'Windowsに存在する全部のハンドルから、CHILD_EXEのプロセスの一緒のハンドルを探す   Call EnumWindows(AddressOf EnumWinProc, 0&)     'もし、起動したEXEのハンドルを取得できたら   If (FindWinWnd <> 0&) Then     'CHILD_EXEを自分のフォームの中に取り込みます     Call SetParent(FindWinWnd, Me.hWnd)          'CHILD_EXEの表示位置を定め、表示を行います     Call SetWindowPos(FindWinWnd, HWND_TOP _             , CHILD_X, CHILD_Y, 0, 0, SWP_NOSIZE Or SWP_SHOWWINDOW)     'CHILD_EXEの監視を行います     Call KANSI_WINDOWS   Else     MsgBox "EXEが見つかりませんでした。"   End If   PGMEND: End Sub Private Sub Command2_Click()   '起動したEXEの終了   Call SendMessage(FindWinWnd, WM_CLOSE, 0&, 0&) End Sub Private Sub Command3_Click()   '自分自身の終了   Unload Me End Sub Private Sub Form_Load()   With Me     .Command1.Caption = "別EXEの起動"     .Command2.Caption = "別EXEの終了"     .Command3.Caption = "アプリケーションの終了"          '「別EXEの終了ボタン」を使用不可     .Command2.Enabled = False          bytFlg = 0   End With End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)   With Me     'もしCHILD_EXEを起動しているならば、終了を行う     If .Command2.Enabled Then       bytFlg = 1       Call Command2_Click     End If   End With End Sub '起動した別EXEのウィンドウを監視します。 '「別EXEの終了ボタン」のEnabledを操作します。 Private Function KANSI_WINDOWS()   With Me     '「別EXEの終了ボタン」を使用可能     .Command2.Enabled = True          '別EXEが起動しているあいだはこのループを回り続ける     Do While (IsWindow(FindWinWnd) = 1)       DoEvents     Loop          'アプリケーションが終了しないときは、「別EXEの終了ボタン」を使用不可に戻す     If bytFlg = 0 Then       .Command2.Enabled = False     End If   End With End Function -----A.EXEのフォーム(ここまで)----- -----A.EXEの標準モジュール(ここから)----- Option Explicit Public Const HWND_TOP = 0 'ZOrderのトップに置く Public Const SWP_NOSIZE = &H1 'ウインドウのサイズを変えないで移動のみ Public Const SWP_SHOWWINDOW = &H40 '再描画の時、ウインドウを再表示 Public Const WM_CLOSE = &H10 '見つかったウィンドウハンドル Public FindWinWnd As Long '探すべきプロセス Public FindPrs   As Long ' ウィンドウのプロセスIDとスレッドIDを取得する関数の宣言 Private Declare Function GetWindowThreadProcessId Lib "user32.dll" _   (ByVal hWnd As Long, lpdwProcessId As Long) As Long '親ハンドルを取得する関数の宣言 Private Declare Function GetParent Lib "user32" _   (ByVal hWnd As Long) As Long 'ウィンドウを列挙する関数の宣言 Public Declare Function EnumWindows Lib "user32" _   (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long 'ウィンドウにメッセージ定数を送る関数の宣言 Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _   (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long ' ウィンドウハンドルからウィンドウが存在するかどうか判断する関数の宣言 Public Declare Function IsWindow Lib "user32.dll" _   (ByVal hWnd As Long) As Long '指定ハンドルのウィンドウの親を変更する関数の宣言 Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long '指定ハンドルのウィンドウのサイズ、位置を変更する関数の宣言 Public Declare Function SetWindowPos Lib "user32" _   (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 'Windowsの全ハンドルを得ることができる関数 '内部処理は、 '(1)指定のプロセスを探す '(2)見つかったプロセスのハンドルを記憶 Public Function EnumWinProc(ByVal hWnd As Long, lParam As Long) As Boolean   Dim lngTrd As Long 'スレッド   Dim lngPrs As Long 'プロセス     'Trueの間は、Windowsに存在するハンドルを最後まで取得しようとする   EnumWinProc = True     '子ウィンドウは未処理   If Not (GetParent(ByVal hWnd) = 0) Then GoTo PGMEND     'スレッドとプロセスを取得する   lngTrd = GetWindowThreadProcessId(hWnd, lngPrs)     '同じプロセスだとしたら   If lngPrs = FindPrs Then     '取得してきたハンドルを記憶     FindWinWnd = hWnd     'これ以上のハンドルは取得しないでもいいので、Falseをセット     EnumWinProc = False   End If   PGMEND: End Function -----A.EXEの標準モジュール(ここまで)----- -----B.EXEのフォーム(ここから)----- 記述する必要なし -----B.EXEのフォーム(ここまで)----- -----B.EXEの標準モジュール(ここから)----- Sub Main()   Load Form1 End Sub -----B.EXEの標準モジュール(ここまで)-----

chiba-masaru
質問者

お礼

ありがとうございました。 いちどやってみます。

その他の回答 (2)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

方法は二つあります。 1.a.exeがb.exeを起動して、状態監視をする。 2.b.exeが終了するまで待機する どちらかの方法を利用して、b.exeを常に最善面に表示するようなAPI関数を呼びます。 今は時間がないので後でサンプルを作成しますね。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.1

クリックされても反応しないというのは無理ですが、クリックされたらbにフォーカスを送るというのはできますねぇ。 デスクトップでさえアクティブになりうるのですから。 bを常に手前に表示しておけば、aがクリックされたときに、bがフォーカスを失うものの、bが一瞬きえることはなしにできますよ。 背景画面をb内の別フォームすることはできないんですか? それだったら、もうちょっと簡単。 目的は満たしてないけど・・・。 MDIフォームなら、完全に目的が果たせますね。 ダメですか?

関連するQ&A

  • 【VB2005】別のプログラムから別のプログラム起動

    "A"というVB2005で、作成したプログラムがありまして、 メインのフォームがあり、 そこにボタンがあります。 Shellの関数を使って、クリックイベントで、 指定したExe"B"を立ち上げます。 そのExe"B"は、VB2005で作成したオリジナルのプログラムです。 プロジェクトは別で作った物と考えてください。 Exe"B"を起動した画面を[フォーム1]と考えて、 ボタンがあり、クリックすると 別の[フォーム2]が表示するはずなのですが、 特にエラーも掴まずに、Showで開くことができません。 しかし、Exe"B"からダイレクトに起動させて ボタンをクリックしたら[フォーム2]が表示されます。 どうしたら、Exe"A"からExe"B"を起動して Exe"B"からフォーム2を呼び出すことができるか、 考えられる要因などをアドヴァイスして頂けたら助かります。

  • C#でのプログラム方法

    C#(コンソールでの実行ファイル)でのバッチファイル実行方法に悩んでいます。 実行イメージとして **************************************** 1. C#(A.exe)をダブルクリックで起動する 2. C#プログラム[A]はバッチファイルを起動する 3. C#(B.exe)をダブルクリックで起動する 4. C#プログラム[B]は2で起動したバッチファイルを終了させる(=DOS窓をCloseさせる?) **************************************** を考えています。 1~2の処理はなんとなくわかったのですが 4にてバッチファイルが起動しているDOS窓をどうCloseさせたらいいのかわかりません。 助けてください。

  • VB.NETとEXE

    VB.NETで作成したフォーム(仮にメインフォームとします)にコマンドボタンを複数貼り付けています。 各コマンドボタンをクリックすると、それぞれの別のEXEが起動します。 (例 コマンドAをクリックすると、EXE-Aが起動、コマンドBをクリックするとEXE-Bが起動。両方一度に起動も可) この時、必ずメインフォームの上にEXEのフォームが重なるように表示されています。 そこで質問があります。 1、複数EXEが起動されている時、一番前面に表示されているEXEを識別する方法はありますか? 「現在アクティブなEXE」とは異なります。なぜなら、メインフォームをクリックすると、前面に表示されているEXEはアクティブな状態とはならないためです。 2、メインのフォームの右上にある「最大化」や「最小化」のボタンをクリックしたら、それに連動してEXEも最大化や最小化をするようにすることは可能でしょうか? すこしわかりにくいと思いますが、補足もしますので、アドバイスよろしくお願いします。

  • VBについて教えてください。

    1.a.exeでShell関数でb.exe起動したときにa.exeはみれなくして   b.exeで終了するとb.exeはなくなりa.exeだけにしたいのですが   どうすればよいのかおしえてください。   a.vbp   RetVal = Shell("c:\b.exe", 1)   ← b.exeの起動 b.vbp end ← 終了   b.exeが起動中はヤククにa.exeがなくなり、b.exeが終了すると   a.exeが起動するようにしたいのです   よろしくお願いします。   WINDOWS98でvb6.0で開発しています。   

  • UWSCの画像認証について。

    UWSCの画像認証について。 画像は以下の4つ A.bmp B.bmp C.bmp D.bmp 画面場のどこかに A.bmp B.bmp のどちらかがある場合 クリックさせ CやDの場合は クリックしないというプログラムを組みたいのですが 初心者でわからなくなりました。 画像1つだけのは他の質問でみつけてクリックできるようになったのですが 判定させることがわかりません。 よろしくお願いします

  • WSHプログラミングで、Shell実行プロセスが終了しない内に、次の処理が実行されちゃいます・・・

    WSH(WindowsScriptingHost)でプログラミングを行っております。 以下のように、「A.exe」実行後、「B.exe」を実行するようにスクリプトを記述しています。 ところが、実際に実行してみると、「A.exe」が終了しない内に、「B.exe」が実行されてしまっている様なのです。 しかし、プログラム処理上、「A.exe」が実行終了してからでないと、「B.exe」を実行するのはまずいのです。 WSHで、「A.exe」が実行終了するまで、「B.exe」を実行させないようなスクリプトの記述方法を教えて下さい。 Set Shell = CreateObject("WScript.Shell") Shell.Run "cmd.exe /c D:\A.exe" Shell.Run "cmd.exe /c D:\B.exe"

  • すべてのプログラム

    画面左下のウインドウズのロゴから、すべてのプログラムを選択して ソフトを起動させようとすると、すべてのソフトにたいして 左クリックで選択しようとすると5秒ぐらいしてから反応します。 以前まではすぐにソフトが起動していました。 そのほかの反応はすべて正常です。なぜにこのスタートからの プログラムに関して時間がかかるようになってしまったのでしょうか 何か設定でもあるのでしょうか? よろしくお願いいたします。

  • 「プログラムの選択」でプログラム一覧が表示されずに、notepadが起動します

    前に同じ内容で質問したのですが、 質問文が誤解を招くような内容だったので、質問文を新しくしました。 「右クリック→プログラムから開く→プログラムの選択」 とやると本来はプログラムの一覧が表示されます。 しかし、現在僕のPCでは「プログラムの選択」を選ぶと、 プログラムの一覧は表示されず、Notepadで起動されます。 「ファイル名を指定して実行」から 「%SystemRoot%\system32\rundll32.exe %SystemRoot%\system32\shell32.dll,OpenAs_RunDLL」 を実行すると、しっかりプログラムの一覧は表示されます。 しかし右クリックからの「プログラムの選択」ができないとかなり不便です。何故代わりにNotepadが起動するのかも不明です。 解決方法が分かる方がいましたら、是非教えて頂けないでしょうか?

  • 2つのプログラムをお互いに切り替えるには

    お世話になります。 VB6.0で開発されたプログラムとVB.Netで開発されたプログラムがあります。 それぞれはプログラム上で何の関連もない独立したプログラムです。 PCの起動時にこの2つのプログラムが起動するものとして、お互いのフォーム上に それぞれの名前のついたボタンを配置したとして、ボタンをクリックすると もうひとつのプログラムがカレント(画面上に表示される)にすることは可能でしょうか? Alt + Tab で切り替えるやり方は存じておりますが、上記のような事が可能であれば そのやり方をお教えいただけますようお願い申し上げます。

  • VB6のWScript.Shellについて

    VB6のWScript.Shellで、他のVB6プログラムを起動する時の戻り値について教えてください。 AというVBプログラムからBというVBプログラムを起動するシステムがあります。 Bというプログラムで取得した値をAに返す方法はありますでしょうか? Aのソースは以下の通りです。 --------------------------------------------- sub test() dim objWshShell set objWshShell = Wscript.CreateObject("WScript.Shell") objWshShell.Run "C:\B.exe" & " " & hikisu1 & " " & hikisu2 , 1, wait End Function ---------------------------------------------- objWshShell.Runの戻り値はtrueまたはfalseのみのようです。 B.exeからtrue、false以外の値を取得する方法はありますか? また、やり方はobjWshShell.Runでなくてもよいです。 よろしくお願いします。

専門家に質問してみよう