起動したアプリケーションを最大化する方法

このQ&Aのポイント
  • VB.NETを使用して起動したアプリケーションを最大化する方法を教えてください。
  • MainWindowHandleを取得してウィンドウを最大化する方法を試しましたが、スプラッシュウィンドウの影響でうまくいきません。
  • 別の方法として起動したアプリケーションのIDやタイトルバーからウィンドウを特定し、最大化したいです。VBのコードを使用してIDやMainWindowTitleを取得し、ShowWindow(hWnd, SW_MAXIMIZE)を実行したいです。
回答を見る
  • ベストアンサー

起動したアプリケーションを最大化したいのですが。(VB.NET)

先日からご回答を頂いて試行錯誤しているのですが、 どうしても実現できずに、再度質問させて頂きました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2089161 の方法でMainWindowHandleを取得して、 そのウィンドウを最大化する動作なのですが、 スプラッシュウィンドウがあるせいか変化が見られません。 試しにHwndを取得する前にSTOPを入れて完全に起動する まで待ってから実行したりもしてみたのですが、 やはり変化がありませんでした。 別の方法として、その起動したアプリケーションのIDやタイトルバーに出ているウィンドウの名前を VBのサイトから引用させていただいた下記のコードで Dim localByName As Process() = Process.GetProcessesByName("notepad") Dim p As Process For Each p In localByName Console.WriteLine("{0} / {1} : {2}", p.Id, p.ProcessName, p.MainWindowTitle) Next 知ることが出来たのでそのIDやMainWindowTitleを手がかりに もう一度hWndを設定し直してShowWindow(hWnd, SW_MAXMIZE)を実行したいのですが、 hWndのところにはIDを入れてもだめなようなので、 IDの内容をhWndと同じ内容に変換する事が出来ればと考えています。 何度ももうしわけありませんが、どうかお助けください。m(__)m

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

  • ベストアンサー
回答No.1

開発用に個人ツールとして、最大化/最小化ボタンのないウィンドウを操作するために、あなたが求めているような機能を作成したことがあります。 記憶が薄いですが、、、私も最初は[API:ShowWindow()]を利用していたと思います。 しかし、何故か操作出来る窓/出来ない窓がありました。原因は未だ不明です。。。 (理由がわかれば、教えて欲しいぐらいです。) そこで、、、 以前 [2080663:サイズ変更したフォームのサイズと位置を設定・取得したいです。] http://okwave.jp/kotaeru.php3?q=2080663 にて、アドバイスをした [API:GetWindowPlacement()] [API:SetWindowPlacement()] にて解消いたしました。 以前のサンプルは、自プロセスのフォームに対して行っておりますが、 Form1_Loadイベントの「Dim l_ptr As IntPtr = Me.Handle」をパラメータ化し、 「p.MainWindowHandle」を利用することにより、設定が可能かと思います。 ----------------------------- Imports System.Runtime.InteropServices -----------------------------   Dim p As Process   For Each p In localByName     'Call 最大化実行(p.MainWindowHandle)   Next Private Sub 最大化実行(ByVal p_Ptr As IntPtr)   Dim l_WINDOWPLACEMENT As WINDOWPLACEMENT   Dim l_blnRet As Boolean   '構造体のサイズ情報を格納   l_WINDOWPLACEMENT.Length = Marshal.SizeOf(GetType(WINDOWPLACEMENT))   '取得実行   l_blnRet = GetWindowPlacement(p_Ptr, l_WINDOWPLACEMENT)   If Not l_blnRet Then     MsgBox("取得失敗")     Return   End If   '各情報の指定   With l_WINDOWPLACEMENT     '最大表示を指定     .showCmd = showCmd_SW.SW_SHOWMAXIMIZED   End With   '設定実行   l_blnRet = SetWindowPlacement(p_Ptr, l_WINDOWPLACEMENT)   If Not l_blnRet Then     MsgBox("設定失敗")     Return   End If End Sub

popopompom
質問者

お礼

できました。(^o^) 中々難しそうなコードだったのですが、コピペだけで使えるように上げて頂いてとてもたすかりました。(^^;) こちらのコードも今後愛用させていただきたいと思います。ありがとうございました。!

関連するQ&A

  • Process.Startで起動したアプリを最大化したいです。VB.NET

    こんにちは、お世話になっております。 下記のようなコードでアプリケーションを起動して ウィンドウを最大化したいのですが、 どのようにしたら良いでしょうか。 3行目のように大きさを画面いっぱいに設定する方法は 出来たのですが、最大化の方法がわかりません。 申し訳ありませんが、教えて頂きたくお願いいたします。 Dim p As System.Diagnostics.Process p = System.Diagnostics.Process.Start("***") MoveWindow(p.MainWindowHandle, 0, 0, 1024, 768, 1)

  • デバッグ時と実行時の識別はできますか?

     多重起動の防止のため、WEBページを参考にしてメインFormのLoad時に、下記のコードで2個目以降起動しないようにしています。 '2重起動の防止 Dim pn As String = Process.GetCurrentProcess.ProcessName If Process.GetProcessesByName(pn).GetUpperBound(0) > 0 Then   MessageBox.Show("すでに起動しています")   Me.Close()   Exit Sub End If  これはうまく行くのですが、デバッグ実行のときに時々起動しないことがあります。 EXEでの実行時にこのようなことはないので、デバッグ時のみこの部分を機能しないようと思っています。 参照可能な内部変数などご存知ないでしょうか。

  • 起動したIEのウインドウタイトルを取得する方法

    こんばんは。WindowsXP+VB.NET環境です。 IE = CreateObject("InternetExplorer.Application") IE.Navigate("http://www.yahoo.co.jp") でインターネットエクスプローラを起動した場合に IEのウインドウの上の部分に表示されている 「Yahoo! JAPAN - Microsoft Internet Explorer」という文字と プロセスIDとプロセス名を取得したいのですが どのようなコードを書けば良いでしょうか? WEBサイトで調べていたら起動中の全プロセスのものを全て表示する 方法はあったのですが、起動したIE限定で取得したいです。 IE.IdとかIE.ProcessName、IE.MainWindowTitleのようにしてみたのですが エラーになってしまいました。 あと、別の方法で Dim hProcess As System.Diagnostics.Process = System.Diagnostics.Process.Start("iexplore") hProcess.WaitForInputIdle() Dim pName As String = hProcess.MainWindowTitle としたら出来るようになったのですが、 起動した後に上の方法でやった時のようにIE.Navigate("http://****")で 移動したりしたいのですが、この方法で起動した場合の 方法が分からなくなってしまいました。 IE = CreateObject("InternetExplorer.Application")で起動したIEのように 操作できるようにする方法を教えて頂きたいです。よろしくお願い致します。

  • VBで外部プログラムを位置のみ指定して実行したい

    Form1上のボタンを押すと、ある別のアプリケーションを実行し、そのウィンドウをForm1の横に大きさを保持したまま配置したいです。 現在は下記のコードを使っていますが、この場合 ・幅・高さが変わる ・一瞬別の位置にウィンドウが見える といった問題があります。 ・位置のみを指定する、もしくは外部のウィンドウのサイズを取得する方法 ・表示する前に位置を変える方法 あるいは ・位置のみを指定して実行する方法 について教えていただきたいです。 Dim p As Process = Process.Start(application) p.WaitForInputIdle() MoveWindow(p.MainWindowHandle, Me.Right, Me.Top, 100, 100, 1)

  • リモートPCで動作しているプロセスにWindowsメッセージを投げるこ

    リモートPCで動作しているプロセスにWindowsメッセージを投げることは可能でしょうか? 下記のようなコードで試してみたのですが、ASP.NETでリモートPCのプロセスを取得できています。 これらの中から目的のプロセスをプロセス名で特定し、MainWindowHandleプロパティでウィンドウハンドルを取得します。 これを利用してSendMessageで目的のウィンドウにメッセージを投げようとしていますが、pFoundWindowには0が入っています。 ちなみに目的のプロセスはAdmin権限で実行されていますが、他の権限で実行されているプロセスも同じようにウィンドウハンドルを取得できていません。 [C#] Process[] processes = Process.GetProcesses("servername”); //プロセスリスト取得 foreach (Process p in processes) { if (p.ProcessName == "target_process"){ //目的のプロセスであれば IntPtr pFoundWindow = p.MainWindowHandle; //メインウィンドウのハンドルを取得 SendMessage(pFoundWindow, msg, wParam, lParam); } MSDNには、MainWindowHandleはローカルPCで実行されているプロセスしか取得できないとありましたが、権限の設定等で取得できないのでしょうか? 通常、リモート接続では実行ユーザがNETWIORK SERVICEになるようですが、これをAdmin権限で実行できれば取得できそうな気がします。 これと同様のことをFindWindow関数を使ってもできるのですが、同じくリモートPCのプロセスではウィンドウハンドルを取得できません。 他に良い方法はありませんでしょうか? サーバーはWindows Server 2003 + IIS6.0です。

  • Active Basic 他のアプリケーションを終了させる

    Active Basic4.23.00を使用しています。 指定したほかのプロセスを終了させようと思っているのですが、 なかなか上手くいきません。 Dim hWnd As HWND Dim err As Long Dim code As DWord hWnd=FindWindow("notepad",NULL) If hWnd=NULL Then MessageBox(hMainWnd,"FindWindowでエラーが発生!","Error",MB_OK or MB_ICONHAND) Exit Sub End If GetExitCodeProcess(hWnd,code) If code=STILL_ACTIVE Then MessageBox(hMainWnd,"GetExitCodeProcessでSTILL_ACTIVEが返った!","Error",MB_OK or MB_ICONHAND) Exit Sub End If err=TerminateProcess(hWnd,code) If err=0 Then MessageBox(hMainWnd,"TerminateProcessでエラーが発生!","Error",MB_OK or MB_ICONHAND) MessageBox(0,Str$(code),"GetExitCodeProcessで取得したコード",MB_OK or MB_ICONINFORMATION) Exit Sub End If このようなコードを書きました。 すみませんが、間違いの指摘のほうをお願いします。 それと、『FindWindow』関数についてです。 ヘルプに、 >lpClassName >検索するクラス名を指定します。必要のないときは、NULL を指定することができます。 とありますが、クラス名≒プロセス名と考えてもいいのでしょうか。 また、lpClassNameを指定し、lpWindowNameにNULLを指定(今回のコードのような場合)では、ハンドルを取得できないのでしょうか。 すみませんが、ご教授をお願いします。

  • VBAIE操作 IEを最大化するには?

    いつもお世話になっております。 エクセルを使ってIEのブラウザを立ち上げて そのブラウザを最大化したいのですがうまくできません。 --------------------------------------------------------- Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function ShowWindow Lib "USER32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long Sub test() Dim objIE As Object Dim ieHwnd As Long ieHwnd = FindWindow("IEFrame", vbNullString) 'IEのウィンドウハンドル取得 Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.ocn.ne.jp/" objIE.Visible = True '意味なし Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop '意味なし Application.Wait Time:=Now + TimeValue("00:00:01") Call ShowWindow(ieHwnd, 3) '最大化 Set objIE = Nothing End Sub --------------------------------------------------------- をF5で実行するとブラウザは立ち上がりますが、最大化されません。 しかし、 Call ShowWindow(ieHwnd, 3) '最大化 の部分にブレークポイントを設置して、 一度止めてF5を押して実行すると、ちゃんと最大化されます。 きちんと最初から最後までF5で実行してブラウザを立ち上げ最大化したいのですが どうすればいいでしょうか? ご回答よろしくお願いします。

  • 最大化時のフルスクリーン

    いつもお世話になっております。 VS2005 を使ってWindowsアプリケーションの実装を行っています。 最大化時にフルスクリーンにしたくプログラムを作成しているのですが、 WndProc内で下記のプログラムを実行し、 最大化アイコンをクリックするとバグ?が起きてしまいます。 -------------------------------------------------- case WM_SIZE:   cxClient = LOWORD(lParam);   cyClient = HIWORD(lParam);   if(wParam == SIZE_MAXIMIZED){ //最大化されたら     ShowWindow(hWnd, SW_SHOWNORMAL); //(1)ウィンドウを元のサイズに戻す     //(2)アプリケーションのウィンドウのフレームを「なし」にする     GetWindowLong(hWnd, GWL_STYLE); //ウインドウ・スタイルの取得     SetWindowLong(hWnd, GWL_STYLE, WS_POPUP); //ウインドウ・スタイルの設定     SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);     ShowWindow(hWnd, SW_MAXIMIZE); //(3)ウィンドウ最大化   } return 0; -------------------------------------------------- 実行したアプリケーションの右上の最大化ボタンを押すと、 見た感じではif文の中を繰り返し行っているような・・・ 元のサイズに戻って最大化になってを数秒繰り返して 最後にペイントして停止します。(高速なため確かではありません) 上記プログラムをどう直したらよいのでしょう。 ご教授お願いいたします。

  • [C#]リモートコンピューターを選択するダイアログ

    C#でコンピュータのプロセスを監視するプログラムを作っています。 Process.GetProcessesByName メソッドによるプロセスの取得は、リモートコンピューターでも可能なようなのですが、以下1・2の実現方法が分かりません。 1.ユーザーが(ダイアログか何かで)リモートコンピューターを選択する 2.選択されたリモートコンピューターの名前かIPアドレスを取得する 3.プロセスを取得する。Process [] ipByName = Process.GetProcessesByName("notepad", "169.0.0.0"); コンピューターを選択して取得するようなダイアログは.NETに用意されていないようですが、この場合どのようにすればよいでしょうか? よろしくお願いします。

  • 起動しているアプリケーションのプロセスIDを取得したい.

    現在,起動しているアプリケーションのプロセスIDを取得したいと考えています. プロセスIDを取得するコマンドはあるのでしょうか? 環境:Windows2000+SP3

専門家に質問してみよう