SetWindowPosについて

このQ&Aのポイント
  • 背面フォーム内の処理をタイマ割込みやループなどで処理しつつ、前面でフォームを表示する場合、SetWindowPosのAPIを使用します。しかし、モーダルフォームを前面表示したときと同じように、背面での処理が走らないことがあります。
  • 背面フォーム内の処理を実行しつつ、前面でフォームを表示する場合、SetWindowPosのAPIを使います。しかし、背面での処理が正しく走らず、解決方法がわかりません。
  • 背面フォーム内の処理を実行しながら、前面でフォームを表示する場合、SetWindowPosのAPIを使用します。しかし、背面での処理が正常に実行されません。解決策を教えてください。
回答を見る
  • ベストアンサー

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を使用しているかもしれません。 情報が少なくて恐縮ですが、この内容で解決の手掛かりとなる事をご教授頂けると幸いです。

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

  • ベストアンサー
  • kmb01
  • ベストアンサー率45% (63/138)
回答No.1

状況を推測すると、 2つのフォームがあり、背面フォームから前面フォームをモードレスで表示し、 背面フォームで時間のかかる処理を実行すると、前面フォームが反応しない、 ということでしょうか。 VB6なら時間のかかる処理にDoEventsを散りばめるといった解決案になると思います。

natural_aspirate
質問者

お礼

kmb01さん、ご回答ありがとうございます。原因が分かったのですが、補足でご説明したいと思います。恐れ入りますが、補足をご覧頂いてもう一度ご助言いただけますと幸いです。

natural_aspirate
質問者

補足

ビット出力と前面フォームの関係です。 sub main() frmA.Show 'frmAフォームを表示 Do 'ビット出力処理 DoEvents Loop end sub '----------------------------------------- sub cmdB_Click() 'frmAのcmdBコマンドボタンでfrmCを表示 Response = "" 'frmCでのイベントによる変数 frmC.Show 'frmCフォームを表示 Do Response = "" 'frmCから値を得るまでループ Doevents Loop   if Response <> "" then '戻り値別の処理 end if end sub '----------------------------------------- 上記は要点だけなので、分かり易く単純化してあります。 問題点は、frmCのイベントにて値が格納される "Response"を確実に得るまでの間ループすることです。 当初SetWindowPosと思われたのですが、もっと単純な部分でのつまずきでした。上記のビット出力処理というのは、どういう状況でも常に実行されなくてはならない箇所(背面処理)で、フォームから発生させるイベントはDB更新やファイル作成など、データ処理をユーザの任意で行うもの(前面処理)で、"Response"を得ないとfrmCを閉じて他の処理へは進めないようにしたいが、背面処理は行いたいというイメージです。

関連するQ&A

  • 実行中のプログラムが自分を隠すため

    そうしたい場所で SetWindowPos(hW,HWND_NOTOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE); としたのですが(hWはこのプログラムのメインウィンドウ)一旦はかくれるもののすぐに自分が前面に現れます どうしたら他の1つのプログラムのウィンドウに隠れた状態にする事ができるでしょうか?

  • 指定したアプリケーションを処理が通るときだけモニターの画面の最前面に出したい

    お世話になります。 C++6.0 MFCで開発しております。 今、 (1)A.exeのボタンを押すとB.exeを起動(A.exeの上にB.exeが表示) (2)B.exeが終了するとA.exeに終了通知をして、A.exeに処理を戻す。  (A.exeを最前面に表示する) (3)再度A.exeのボタンを押す。  →(1)のときは、A.exeの上にB.exeが表示されていたのに、A.exeの下にB.exeが表示される (2)のA.exeに処理を戻した後、A.exeが最前面に出るように SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE) を実行しています。 (1)、(3)のA.exeのボタンを押すと、A.exeの上にB.exeが表示され、 (2)の時に、A.exeが他のアプリケーションを含めて、最前面、モニターの最前面に表示されるようにしたいのです。 お手数ですがなにとぞよろしくお願いします。 以上よろしくお願いします。

  • アクセス2010本体フォーム固定

    アクセス本体のフォームの大きさを固定したく、下記サイトを参考にし http://hatenachips.blog34.fc2.com/blog-entry-2.html SetWindowPos hWnd, HWND_TOP, 0, 0, 800, 600, SWP_NOMOVE 、としました。 これを解除してフォームの大きさを変更できるようにするには、どうしたらよろしいでしょうか?

  • Formをアクティブにする

    バックグラウンド(フォームは非表示にしている)で実行しているプログラムでエラーが発生した場合にサブフォームを表示しています。 このサブフォームを最前面に表示しフォームをアクティブにしたいのですがどのようにすればよろしいでしょうか?(このフォームにはテキストボックス等はなくラベルのみです。) 現在、SetWindowPosにてこのサブフォームのhwndを渡し、HWND_TOPMOSTにしサブフォームにSetFocusさせています。 しかし、実行されると最前面には来るのですがタイトルバーが点滅(?)した状態になりアクティブになりません。このフォームをクリックするとアクティブとなります。 よろしくお願いします。

  • 「コンパイルエラー End Subが必要です。」

    Access2016でファイルを作成しているのですが、下記のVBAを実行しようとすると、「コンパイルエラー End Subが必要です。」とエラーメッセージが返ってきてしまいます。 構文の修正が必要であるとお気づきであれば、その箇所を教えていただけないでしょうか。初歩的な質問で恥ずかしい限りですが、何卒よろしくお願い致します。 Option Compare Database Option Explicit Public Declare PtrSafe 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 fuFlags As Long) As Long Public Declare PtrSafe Function GetSystemMenu Lib "user32" _ (ByVal hWnd As Long, ByVal fRever As Long) As Long Public Declare PtrSafe Function RemoveMenu Lib "user32" _ (ByVal hMenu As Long, ByVal uItem As Long, ByVal fuFlags As Long) As Long Public Const SWP_NOMOVE = &H2 Public Const SWP_NOSIZE = &H1 Public Const HWND_TOP = &H0 Public Const SC_SIZE = &HF000 Public Const SC_MAXIMIZE = &HF030 Public Const SC_CLOSE = &HF060 Public Const SC_RESTORE = &HF120 Public Const MF_BYCOMMAND = &H0& Public Sub test() Private Sub Form_Open(Cancel As Integer) Dim hWnd As Long hWnd = Application.hWndAccessApp SetWindowPos hWnd, HWND_TOP, 0, 0, 800, 600, SWP_NOMOVE hWnd = GetSystemMenu(hWnd, 0) RemoveMenu hWnd, SC_SIZE, MF_BYCOMMAND End Sub

  • フォームのサイズを変更したいです。

    フォームビューにて、 void CProject2View::OnBnClickedButton1() { this->SetWindowPos(&wndTop,0,0,100,100,SWP_NOMOVE); } とすると、スクロールバーが表示されるだけです。 タイトルのことをするにはどうすればいいですか? よろしくお願いします。

  • 非アクティブのウィンドウを最前面に呼び出したい。

    右ダブルクリックで呼び出すランチャプログラムを作成したいのですが、 システムフックをかけてWM_RBUTTONDBLCLKをアプリ側に送り,それに反応させる形でランチャのウィンドウを最前面に持ってきたいのですが上手くいきません。 フックされたメッセージが送られてきた場合の処理は以下のようになっています。 ~省略 case WM_USER+100: //ダブルクリックが送られてきた場合のメッセージコード //任意文字列を別ウィンドウのリストボックスに吐く自作関数 Add("dblclk"); //以下でウィンドウを最前面に持ってくる。 //lpにクリックされた座標が入っている SetWindowPos(hWnd , HWND_TOP,(int)LOWORD(lp),(int)HIWORD(lp), NULL,NULL,SWP_NOSIZE|SWP_SHOWWINDOW); SetForegroundWindow(hWnd); UpdateWindow(hWnd); break; ~省略 このコードの場合、ウィンドウの位置は変更されるのですが、最前面に来てくれません。 Add関数が呼ばれているのでフック自体は成功しているようなのですが、何かおかしな点はありますでしょうか?

  • C# フォームを常に最背面に表示し、その後、最前面に移動する

    フォームを常に最背面に表示する http://jeanne.wankuma.com/tips/form/bottommost.html 上記サイトでフォームを最背面にする方法が紹介されていますが、これを実行すると TopMost=true; に変更しても、常に最背面にしかなりません。 元の状態(標準)や、最前面に移動させるにはどのようにすればいいのでしょうか? ※丸投げで申し訳ないのですが、私はAPIの知識はゼロです。 直球の回答を下さる方、よろしくお願いします。

  • PythonでSetWindowPosを使うにはどうしたら良いでしょうか?

    少し前から、Tkinterを使って居りウィンドウを常に最前面に表示したいと思い立ちwin32guiとwin32conと言うモジュールが必要で、インポートするところまで辿り着いたのは良いのですが、その後がよくわかりません。 実験的に from Tkinter import * import win32gui,win32con root = Tk() win32gui.SetWindowPos(root,win32con.HWND_TOPMOST,0,0,200,150,win32con.SWP_SHOWWINDOW) root.mainloop() のようなコードを実行してみたのですが以下のようなエラーメッセージが帰ってきます。 Traceback (most recent call last): File "C:\Documents and Settings\PC USER\デスクトップ\Python\q2.py", line 9, in -toplevel- win32gui.SetWindowPos(root,win32con.HWND_TOPMOST,1,1,100,50,win32con.SWP_SHOWWINDOW) AttributeError: Tk instance has no attribute '__int__' 引数の与え方もいろいろなサイトの切れ端を集めたような感じで書いてしまったのでそもそもの書き方が違っているのかもしれません。 私の検索が不足なのは重々承知ですが、よろしければ実際にはどのように書けばウィンドウを最前面に出すことができるのかと、エラーメッセージの具体的な意味を教えて欲しいです。お願いします。

  • windowを常に手前にしたい。

    すみません。教えてください。 [環境] windows2000 visual c++6.0 [内容] 親ウインドウから子ウインドウを呼び出して、常に子ウインドウを手前にし、かつ常にアクティブにしたいのですが、うまくいきません。 [ソース] 親ウインドウ : : : CSysCp02Dlg2* frm02Dlg; frm02Dlg = new CSysCp02Dlg2(); frm02Dlg->Create(IDD_SYSCP02_DIALOG,NULL); frm02Dlg->ShowWindow(SW_SHOW); : : (裏で処理をする) :  delete frm02Dlg; (処理の終了) [ソース]子ウインドウ : : :  this->SetActiveWindow();  this->SetWindowPos(&wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); : : : イメージ的には、DoModalで子ウインドウを表示し、裏の親ウインドウで処理をしたいのです。(もちろんDoModalでは無理なので、Createをしていますが....) どなたかご存知の方いらっしゃいましたら、ご教授お願いいたします。

専門家に質問してみよう