VB.NET2003でウィンドウを最前面に表示する方法

このQ&Aのポイント
  • VB.NET2003でフォーム内のボタンを押すと、その下のウィンドウを常に最前面に表示する方法について教えてください。
  • 提供いただいたコードでは目的の動作が得られない場合があるようです。正しい動作を実現するためには、以下の訂正箇所が必要です。
  • Dim win1 As Integer, win2 As Integer, win3 As Integerとしてウィンドウの情報を一時的に格納する変数を宣言します。GetTopWindow関数を使用してMe.Handle.ToInt32によって取得したウィンドウのハンドルをwin1に代入します。GetParent関数を使用してwin1の親ウィンドウのハンドルをwin2に代入します。さらに、GetNextWindow関数を使用してwin2の次のウィンドウのハンドルをwin3に代入します。そして、SetWindowPos関数を使用してwin3の位置を指定します。
回答を見る
  • ベストアンサー

一つ前のウィンドウをTopMost=Trueに設定したい

VB.NET2003でフォームを表示していて そこにあるボタンを押すとその下のウィンドウを 常に最前面に表示するようにしたいのでAPIを使って下のように 書いてみたのですががうまく動いてくれません。 恐れ入りますが訂正箇所などを教えていただければ幸いです。 Dim win1 As Integer Dim win2 As Integer Dim win3 As Integer win1 = GetTopWindow(Me.Handle.ToInt32) win2 = GetParent(win1) win3 = GetNextWindow(win2, 2) SetWindowPos(win3, -1, 100, 100, 100, 100, &H40) 宜しくお願い致します

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

  • ベストアンサー
  • kikujack
  • ベストアンサー率47% (17/36)
回答No.2

gomachans1さんのコードを実行すると何かエラーがないのに、うまく動きませんでした。 いちいち行デバッグしたら、正しいHandleを取得できないことに気づきました。 コードを修正するつもりですが、うまくできませんでした。 >>一つ前ウィンドウをTopMost=True そのウィドウはVB.2003のMDIサブウィドウですか?

gomachans1
質問者

補足

わざわざ試して頂いてありがとうございます。 設定したいウィンドウはMDIウィンドウではなく インターネットエクスプローラーや開いたフォルダや市販のソフトなど なんでも設定したいです。 IntegerをIntPtrに変えたり色々試しているのですが、 最前面に真っ白な■が表示されて消えなくなってしまったりと 全く違うハンドルやID?でAPIを実行してしまっているようです。 お助けいただきたいです。

その他の回答 (2)

  • kikujack
  • ベストアンサー率47% (17/36)
回答No.3

それなら、力にならないとおもいます。 すみませんでした。

  • kikujack
  • ベストアンサー率47% (17/36)
回答No.1

GetTopWindow GetParent GetNextWindow SetWindowPos この四つのAPI関数をちゃんと宣言しますか?

gomachans1
質問者

補足

ご回答をありがとうございます。 APIの宣言ですが、下のように行っております。 間違いなどありましたらご指摘頂けると幸いです。 Declare Function SetWindowPos Lib "user32.dll" _ (ByVal hWnd As Integer, ByVal hWndInertAfter As Integer, _ ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, _ ByVal cy As Integer, ByVal uFlags As Integer) As Integer Declare Function GetTopWindow Lib "user32.dll" _ (ByVal hWnd As Integer) As Integer Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" _ (ByVal hwnd As Integer, ByVal wFlag As Integer) As Integer Declare Function GetParent Lib "user32.dll" _ (ByVal hWnd As Integer) As Integer

関連するQ&A

  • VB.NETからエクセルを起動して、エクセルでVBを閉じたい。

    こんにちは。 先日、エクセルのフォームを最前面に配置したいという 質問をさせて頂いたものでございます。 それで、SetWindowPosのAPIで設定する方法を教えて頂いたのですが、 最前面にする事は出来たのですが、フォームを動かすと ブックはその一つ下に現れてしまい、 ブックを最背面に配置するなどを試みてみたのですが、 どうもうまく行かないので、 エクセルから直に立ち上げることが出来ないようにして VB.NETのフォームを作ってエクセルにデータを送ろうかと思いました。 それで、データを送る方法は何とかなりそうなのですが、 VB.NETのフォームからエクセルを起動して、 次にエクセルからそのフォームを出したり、隠したりしたいのですが、 その場合、VB.NETのフォームのなんと言うハンドルを取得すればよいでしょうか? IDにも色々あるようで、どれを使えばよいのか分からなくなってしまいました。 そのIDはVBのフォームを起動した時に、エクセルと共有するiniファイルなどに、書き込んでおこうかと思っています。 よろしくお願いいたします。m(__)m

  • VB.NETのSendMessageを教えてください

    SendMessageというAPIを試しているのですが、まず試しに Button2.Text = "test" と同じ結果をSendMessageでやってみたいのですが 下のようにしてみたのですが、変更になりませんでした。 どのようにすれば良いかご教授頂ければ幸いです。よろしくお願致します。 Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer Private Const WM_SETTEXT As Integer = &HC Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim h As Integer h = Me.Button2.Handle.ToInt32 SendMessage(h, WM_SETTEXT, 0&, "test") End Sub VB.NET2003 FrameWork1.1 WindowsXP-PRO(SP2) です。

  • SetWindowPosについて

    こんにちは。以前のスレッドを何件か拝見して、私の事象がないようなので、投稿します。背面フォーム内の処理をタイマ割込みやループなどで処理しつつ、その前面でフォームを表示する場合、SetWindowPosのAPIが有効というところまでは分かっているのですが、私の場合、割り込みによるビットのON/OFFをしたいと思ってロジックを組んでいるのですが・・・ どうしてもモーダルフォームを前面表示したときと同じように、背面での処理が走ってくれません・・・ ロジックですが、前面フォームのイベントを sub Form_Load() SetWindowPos(frm_ctrl.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) end sub のように行っています。アンロード時にハンドルの設定は解除してあります。 タイマ割込みの処理が他者作成のため、目下処理が不明なのですが、こちらの方もAPIを使用しているかもしれません。 情報が少なくて恐縮ですが、この内容で解決の手掛かりとなる事をご教授頂けると幸いです。

  • 「VB4.0の「LSet」と同等の機能をVB2008で実行するには?」のリストを修正します

    「VB4.0の「LSet」と同等の機能をVB2008で実行するには?」の質問で リストに間違いがあったので訂正します。 Public Type TpstndefをPublic Type Tpkyokudef VB2008の練習のために、VB4.0のコードをVB2008にコンバージョンしています。 VB4.0の「LSet」がどうしてもコンバージョンできません。 LSet 以外はVB2008で機能がありました。 なにか方法はないでしょうか。 リストをコピーします。 Public Type Tpkyokudef equip As Integer stn_no As Integer stn_class As Integer line_no As Integer stn_kind As Integer End Type Dim kdata As Tpkyokudef Dim rbuf As buf1K    ・   省略    ・ Get #fno, seeksize, rbuf LSet kdata = rbuf

  • 設定プロパティについて

    Sub InStrSample1() Dim myData As String Dim i As Integer myData = "*******@projecta.co.jp" i = InStr(myData, "@") MsgBox Left(myData, i - 1) End Sub ネット上で上のようなプログラムを見つけ、VBで書いてみたら何も動きませんでした。ダイアログボックスに*******と表示されるらしいんですが、その設定プロパティがわかりません。お願いします。

  • 構造体配列

    こんにちわ。VB.NET初心者です。伝授お願いします。 VB6では Type Tpn_Index IdxSu As Integer idx(MAXTPN-1) As Integer End Type と定義できますが、VB.netでは構造体の中の配列部分が定義できません。 どのように書けばよろしいでしょうか? Public Structure Tpn_Index Dim IdxSu As Integer Dim idx() As Integer End Structure 上記の Dim idx() As Integer の部分です 宜しくお願いします

  • VB6のTYPE文をVB.NETのStructureに変えるとき

    VB6のTYPE文をVB.NETのStructureに変えるとき 下記VB6のコードをVB.NETのStructureに変える場合 Type kouzou1 i As Integer j As Integer a As String * 20 b As String * 50 End Type を下記にしてみたのですが *20,*50のところは、どのように表現するのでしょうか。 Structure kouzou1 Dim i As Integer Dim j As Integer Dim a As String * 20 <- ステートメントの終わりを示してくださいのエラーになる。 Dim b As String * 50 <- ステートメントの終わりを示してくださいのエラーになる。 End Structure お教え下さい。

  • EXCELの最前面設定解除について

    こんにちは。 VBでFindWindow関数を使用してEXCELのハンドルを取得し、SetWindowPos関数で 最前面に設定しているのですがEXCEL標準のダイアログボックスを開いたり (オプション設定や列幅設定等)、タイトルバーをダブルクリックしたり最大化 ボタンを押下して画面最大にしその後画面を元に戻した後、他のウィンドウが 上位に来たりして最前面設定が消えていました。 これはなぜでしょうか?この現象が起こらない(何をしても常に最前面)ように するにはどうすればよいでしょうか? 長くなりましたがどうか宜しくお願いします。

  • 変数

    Dim トータル As Integer トータル = 200 Dim 変数1(トータル) As Integer Dim 変数2(トータル) As Integer Dim 変数3(トータル) As Integer Dim 変数4(トータル) As Integer ※変数1~4に同じ数の変数(クローン??)を用意したいのですがエラーがでます。 このような使い方は出来ないのでしょうか? なお、VB上ではローマ字で使っています。 変数は6個ぐらいあり 毎回変えるのは面倒なので・・・ (スパイラルモデル方式??といっても使うのは私自信ですが・・・)

  • VB4.0の「LSet」と同等の機能をVB2008で実行するには?

    VB2008の練習のために、VB4.0のコードをVB2008にコンバージョンしています。 VB4.0の「LSet」がどうしてもコンバージョンできません。 LSet 以外はVB2008で機能がありました。 なにか方法はないでしょうか。 リストをコピーします。 (投稿したらインデントが消えました) Public Type Tpstndef equip As Integer stn_no As Integer stn_class As Integer line_no As Integer stn_kind As Integer End Type Dim kdata As Tpkyokudef Dim rbuf As buf1K    ・   省略    ・ Get #fno, seeksize, rbuf LSet kdata = rbuf

専門家に質問してみよう