VB.NET、WinXPでフォームを最前面に表示する方法

このQ&Aのポイント
  • Visual Basic .NETとWindows XPを使用して、フォームを最前面に表示する方法について質問があります。フォーム内のボタンを押すと指定のフォルダを開き、その後に再度フォームを最前面に表示したいですが、コードを実行するとフォルムがアクティブにならずに終了してしまいます。
  • 現在、フォルダを開くためにはSystem.Diagnostics.Process.Startメソッドを使用していますが、フォルダを開くためには少し時間がかかります。そのため、適切な処理時間が経過した後にフォームを最前面に表示する方法を知りたいです。
  • いくつかの試みをしてみましたが、うまくいきませんでした。CreateObjectメソッドやMe.Focusメソッドを使用してみたり、フォルダを開くコードを置き換えてみたりしましたが、期待した動作が得られませんでした。ご教示頂ければ幸いです。
回答を見る
  • ベストアンサー

フォームを最前面に表示したいです。

VB.NET、WinXPなのですが、 form1のボタンを押して、指定のフォルダを開いた後に 再度そのボタンのあるform1を最前面に表示したいのですが、  System.Diagnostics.Process.Start("C:\WINDOWS")  Me.Activate() などとしてファイルがたくさんあるフォルダを開くと完了まで時間がかかり 次のMe.Activate()の命令が無視されてしまうようで form1がアクティブにならないまま終わってしまいます。 少し待機しようと  System.Diagnostics.Process.Start("C:\WINDOWS")  System.Threading.Thread.Sleep(500)  Me.Activate() とすると正常に開くのですが、ファイルが少なくても 高速なマシンでも一律0.5秒停止してしまうのではなく、 表示が完了されているかどうかを判定するようにしたいのですが、  Dim P As Object P = CreateObject("Shell.application") P.open("c:\windows")  Do While P.Busy = True : Loop などのように待機する方法があったら教えて頂きたいです。↑はエラーになってしまいました。 フォルダを開くコードを  CreateObject("Shell.Application").Open("C:\WINDOWS") に置き換えてみたり、  Me.Focus()やMe.show() などを試してみたのですが、うまくいきませんでした。 毎回申し訳ありませんが、よろしくお願いいたします。

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

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

Me.TopMost = True '何かの処理 でいかがでしょう。

popopompom
質問者

お礼

お返事ありがとうございます。 早速こちらの方法でやってみることにします。

関連するQ&A

  • アプリケーションAから外部アプリケーションBを

    アプリケーションAから外部アプリケーションBを 呼び出す処理。 Bのフォームを常に最前面にして、Aのフォームを操作できないようにしたいです。 ただしAにあるタイマーを止めないようにもしたいです。 そこで [C#] //ファイルを開いて終了まで待機する System.Diagnostics.Process p = System.Diagnostics.Process.Start("C:\\test.exe"); p.WaitForExit(); ※「test.exe」を外部アプリケーションBとする。 を使ったのですが、Aのタイマーが止まってしまいます。 何か良い方法はないでしょうか? 言語はC#です。

  • VC#2008の動作について

    VC#2008について、下記の場合、button1をクリックし、 その次に、button2をクリックしても全く反応しません。 どのように改良すれば反応しますか? 処理が重く止まったと感じた時、メッセージを表示した後、 アプリケーションを終了したいと思っています。 どなたかご存知の方、教えていただけないでしょうか? 宜しくお願い致します。 namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1(){ InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { System.Threading.Thread.Sleep(10000000); } private void button2_Click(object sender, EventArgs e) { MessageBox.Show("close"); System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("myapp"); foreach (System.Diagnostics.Process k in p) { k.Kill(); } } } }

  • フォルダ選択でなくフルパスをセルの値から取得したい

    フォルダを選択して写真をシート上に表示するマクロを探すことができました。 LUは, http://programlife.jugem.jp/?eid=48 できれぱセルの値のフルパスを参照して写真を表示したいと思いいろいろ試して見ましたがうまくいきません。最後のフォルダを選択しなけれぱならないようです。 変更前 ' フォルダ選択画面を表示 Set shell = CreateObject("Shell.Application") Set myPath = shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:¥") 変更後 "C:¥") ⇒ Sheets("データ").Cells(4, 1).Value   へ変更 フルパス = Sheets("データ").Cells(4, 1).Value = C:\Users\***\Desktop\写真 ' フォルダ選択画面を表示 Set shell = CreateObject("Shell.Application") Set myPath = shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, Sheets("データ").Cells(4, 1).Value ) どうかよろしくお願いします。

  • vbsでexcelのクリアとフォームの表示をしたい

    お世話になっております。 vbsの以下の記述でexcelを開いています。 開くところまでは行くのですが、その後のsheet1のデータのクリアとUserForm1の表示がどうしてもできません。 申し訳ありませんが、どなたかおわかりの方、教えていただけないでしょうか。 宜しくお願いいたします。 Dim oApp Dim objWshShell Dim scriptPath 'Excelオブジェト作成 Set oApp = CreateObject("Excel.Application") 'WScript.Shellオブジェクト作成 Set objWshShell = CreateObject("WScript.Shell") oApp.Visible = True '不可視にする oApp.UserControl = True 'Excelファイルを開く scriptPath = WScript.ScriptFullName scriptPath = left(scriptPath,len(scriptPath)-len(WScript.ScriptName)) oApp.Workbooks.Open scriptPath & "共同資料.xlsm"

  • フォルダ選択と取得したパスの表示

    どうしてもわからないのでご教授お願いします。 コマンドボタンを使用して、フォルダの選択のダイアログを表示し、選択したフォルダのパスを取得することはできたのですが、そこから取得したパスを任意のセルに表示させたいです。 どうすれば表示させることができるでしょうか。 Private Sub commandbutton1_Click() Dim Shell, myPath Set Shell = CreateObject("Shell.Application") Set myPath = Shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\") If Not myPath Is Nothing Then MsgBox myPath.Items.Item.Path Set Shell = Nothing Set myPath = Nothing End Sub ご教授宜しくお願いします。

  • VB2010でMDI親フォームから子フォームを表示

    VB2010でソフトを作っております。 MDI親フォームから子フォームを表示させたいのですが…。 過去に少しだけVB6を使っていたことがありますが、クラスという概念に苦労しております インスタンスや初期化といったところをうまく扱えばとは思うのですが、よろしくご指導お願いいたします。 1.MDI親フォーム(Form1)のボタンを押し、子フォーム(Form2)を表示させる 2.子フォームが表示されていなかったら表示させる 3.子フォームが表示されていたら何もしない これだけの事ですがずいぶん悩んでおります。 全コードがこれです。 Public Class Form1 Private f2 As New Form2 Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.IsMdiContainer = True End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fChild As Form() = Me.MdiChildren For Each f As Form In fChild If f.Text = "Form2" Then Exit Sub End If Next f2 = New Form2 f2.MdiParent = Me f2.Show() f2.Activate() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 f2.MdiParent = Me End If f2.Show() f2.Activate() End Sub End Class ボタン1でもボタン2でも、期待する動作はするのですが、 ボタン1ではアクティブになっているフォームの名前を力技で取得している気がして… ボタン2では子フォーム(Form2)をすでに表示している状態でもさらにShowをしているのが気に入らなくて… もっとスマートな方法がありましたら、ご指導お願いします。

  • アイコン表示の不具合

    フォルダを示すアイコンの表示がおかしくなってしまいました。 いわゆるデフォルトの状態で使ってるのですが、 黒く塗りつぶしたよなアイコンになってしまいます。 C:\WINDOWS\System32\shell32.dll のファイルが破損してしまったのでしょうか… これは、どこかで手に入れることが可能でしょうか? 教えてください。

  • Windowsフォームの表示

    Visual C++ 2005(Express Edition)で、windowsフォームを3個作りました。 1個目をForm1.h、2個目をForm2.h、3個目をForm3.h、メインプロジェクトは、Sample.cpp, ファイルとします。 Form1にボタンbutton1を作成し、ボタンをクリックしたイベントが発生したとき、Form2を表示させます。 Form2には、ボタンbutton2があります。 Form1と同様に、Form2のボタンをクリックするとForm3の画面が表示されるようにします。 ところが、以下のソースファイルで書いたところ、Form2とForm3は、名前空間に存在しませんという意味のエラーが生じます。 Form2とForm3をインスタンス化し、Show()メッソドで、画面を表示させる方法です。 しかし、Form1とForm2だけのファイルですと、先のソースの書き方で上手くいきます。 何か、書き方が異なるのでしょうか?正しい書き方を教えてくださいますとありがたいです。 なお、C++/CLIの文法に沿った、ソースコードでお願いします。 <ソースファイル> ----Form1.h----------------------------- #pragma once #include "stdafx.h" #include "Form2.h" #include "Form3.h" namespace Sample { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { //button1を作成 //省略 #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Form2^ a = gcnew Form2(); a->Show(); } }; } [EOF] --------------------------------------- ----Form2.h---------------------------- #pragma once #include "Form1.h" #include "Form3.h" using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; namespace Sample { /// <summary> /// IsotopeInput の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class Form2 : public System::Windows::Forms::Form { //button2を作成 //省略 } #pragma endregion private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { Form3^ b = gcnew Form3(); b->Show(); } }; } [EOF] --------------------------------------- -------Form3.h-------------------------- #pragma once #include "stdafx.h" #include "Form1.h" #include "Form2.h" using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; namespace Sample { /// <summary> /// Result の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class Form3 : public System::Windows::Forms::Form { //省略 } #pragma endregion }; } [EOF] --------------------------------------------------------- Sample.cpp----------------------------------------------- // Sample.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" #include "Form1.h" #include "Form2.h" #include "Form3.h" using namespace Sample; [STAThreadAttribute] int main(array<System::String ^> ^args) { // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; } [EOF] ------------------------------------------------------------

  • 起動した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のように 操作できるようにする方法を教えて頂きたいです。よろしくお願い致します。

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

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

専門家に質問してみよう