• ベストアンサー

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

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

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

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

MSDNの後半に以下の記述がありました ~以下MSDN引用~ 最前面のウィンドウが Z 順位の一番下 (HWND_BOTTOM) か最前面以外のウィンドウの後に再配置されると、そのウィンドウは最前面のウィンドウでなくなります。 最前面のウィンドウが最前面のウィンドウでなくなると、そのオーナーと所有するウィンドウも最前面のウィンドウでなくなります

関連するQ&A

  • チャイルドダイアログの最前面表示

    現在、MDIフレーム上に、複数のチャイルドスタイルのダイアログが存在するプログラムを改造中です。 その中にMapDKIVの地図を描画しているダイアログがあり、その地図上に縮尺スケールのビットマップを描画しようとしています。(MapDKIVには、その機能がまだ無い為) 縮尺スケールのビットマップを描画する為のダイアログを同様にチャイルドスタイルにし、SetWindowPos()を使って最前面に表示しようとしましたが、地図を描画しているダイアログをクリックすると、後ろへ行ってしまいます。 MSDNのSetWindowPos()の説明には、 「子ウィンドウ、ポップアップウィンドウ、またはトップレベルウィンドウのサイズ、位置、および Z オーダーを変更します。」 と記述されています。 が、あるサイトでは、 「MDI子Formは、子Windowであって、TopLevelWindowではないのですから、SetWindowPosは最前面や最背面設定を受け入れません。」 と記述されています。 縮尺スケールのビットマップを描画する為のダイアログを通常のスタイルにし、「フォアグランド表示する」とすると、メインフレームのサイズを小さくしたり、移動した時に、その場所へ取り残されてしまいます。 何か、方法はないものでしょうか? 開発環境 VisualC++ 6.0 SP6 どなたかお助け下さい!よろしくお願いします。

  • ダイアログ最前面表示時の後ろの画面操作について

    はじめまして。 お世話になります。 開発環境:WindowsXP VC++6.0 MFC使用 ダイアログベースで画面を作成(A.exe CDialogベース)し、その画面でボタンを押下し 子画面(A_Child)を表示させます。表示方法はDoModal()で。 そのA_ChildはCDialogベースです。 A_Childダイアログが表示されている間(最前面)は、デスクトップ上の操作を 何も出来ない様にしたいのですが、方法はありますでしょうか? (例:スタート→ログオフでダイアログが表示しますよね。 その時ってそのダイアログ以外は触れないですよね。) せめて、自分たちが作成したアプリだけでも操作不可能にしたいのです。 SetWindowPos()、ModifyStyle()、色々試しましたが上手くいきません。 DoModalで表示させるのがそもそもまちがいののでしょうか? 何か方法が有りましたらよろしくお願いします。 説明が下手ですみません。

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

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

  • 画面を最前面表示したい

    以下に記載する事を出来るVBアプリを作りたいです。 IEを複数起動します。そして、全画面表示にして、 ある間隔でIEの順序を交換したいです。 ある時間間隔で、後ろのIEを最前面に表示します。 これを繰り返したいのですが、うまくいきません。 APIを使えばと思ったのですが、IEのウィンドウ ハンドルの取得方法がわかりません。参考のHPを 見たのですが、「notepad],「電卓」などは、分かるのですが、IEの場合が分かりません。  初心者なもんで、やさしい言葉でお願いします。

  • フォームを正しく最前面にする方法は?

    VB6(SP4)をWin2000で使用しています。(下記問題はWinMeでも生じます) フォームを一度消した後、処理をして、処理の終了後、再度表示すると最前面にならずに、タスクバー上のボタンやフォームのタイトルバーが点滅するだけになってしまいます。どのようにすれば、ちゃんと最前面になるのでしょうか? プログラムの内容は Private Sub Command1_Click()   Me.Visible = False   ※処理(他のAPを起動し、そのAPが終了するまで待機する)   Me.Visible = True   Me.SetFocus End Sub よろしくお願いします。

  • タイトルバーやメニューバーの高さ取得

    サイズ変更可能なダイアログ ボックスアプリケーションを作っています ダイアログサイズ変更時に GetClientRect( m_DlgSize ); のようにしてサイズを取得し、設定ファイルにm_DlgSizeを保存します 次回起動時にInitDialog()で SetWindowPos( NULL, 0, 0, m_DlgSize.Width(),m_DlgSize.Height() ,SWP_NOMOVE); のように復元しました。 幅はきちんと復元できたんですけど高さが小さくなってしまいます。 どうやらGetClientRectではメニューバーやタイトルバーの高さを含めない座標を返し、 SetWindowPosではそれらも含めてサイズを設定してしまうようです この差を埋めるためにメニューバーやタイトルバーの高さを取得する方法がわかりません。 何か良い方法があったらご教授願います。 環境はVC++6.0 MFCです。

  • ウィンドウを終了させたい・・・

    いつもお世話になっています。 画面遷移時にあるメッセージウィンドウ(別exe)をVBから起動させ、遷移が終わった後にそのexeを終了させるプログラムを作っています。 プログラムの中身としては、 (1) Shell関数でexe(メッセージウィンドウ)を起動 (2) FindWindowで、起動しているexeのハンドルを取得 (3) 取得したハンドルに、SendMessageでexeを閉じるようにする(WM_CLOSEを使用)。 ・・・といったものです。 (1)と(2)はうまくいくのですが、最後のSendMessageがうまくいきません(>_<) 試しに(1)と(2)の後に、Do文の中で [1]SendMessageで起動したexeを終了させるようにする [2]FindWindowをして、ハンドルが0だったら、Exit Doする ・・・ようにプログラムしてみたところ、永久ループになってしまいました・・・。 他にも、SendMessageの代わりにShowWindowを使ってみましたが同じくダメでした・・・(T-T) ネットで調べていますが、他の方法が浮かびません。 どなたか、良い方法をご存じでしょうか?? よろしくお願いします!!

  • 最前面に無理やりフォームを持っていきたい

    フルスクリーンで実行されるオンラインゲームがあります。 そのオンラインゲームの最前面に自作のタイマーを表示させたいのですがうまくいきません。 TopMostを設定して、デスクトップ画面ではうまく行くのですが、オンラインゲームの方をアクティブにすると解像度の変更中に後ろに下がってしまいます。 解像度が変更されてフルスクリーンで実行されるゲーム(DirectX?)に対して最前面にフォームを設定できる方法があれば教えてください。

    • ベストアンサー
    • CSS
  • 一つ前のウィンドウを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) 宜しくお願い致します

  • 画像ヴューアー画像を最大にした時、タスクバーが前面に出るようにするには?

    「タスクバーを自動的に隠す」に設定していますが、画像ヴューアー画像を最大表示にした時、タスクバーが前に出てこなくなってしまいます。少し画像ウィンドウを下にずらせば出るのですが、毎回そのようにすることは困難です。「タスクバーを自動的に隠す」で、なおかつ、画面最大でもタスクバーを前面に出す方法をお願い致します。「ウィンドウの前面に出す」 にはクリックしてあります。その状態で前面に出てきません。使用ヴューアーはSusie です。

専門家に質問してみよう