ウィンドウ表示位置の制御について

解決


HogeHoge  2006-12-22 02:46:39  No: 97496

例えば、画面上の左上隅に既に開かれている他のアプリがあるとします。

そのアプリのウィンドウと重ならないように、自アプリのウィンドウを
表示させようと以下のようにプログラミングしてみました。

1.他アプリのハンドルを取得する
2.他アプリのウィンドウの座標情報を取得する
3.Win32APIのMoveWindow関数で自アプリのウィンドウ表示を制御する

現象
  自アプリのウィンドウが表示されない

そこで質問です。
質問1.そもそも他のアプリのウィンドウと重ならないように制御する
        ことは可能なのでしょうか
質問2.可能な場合、プログラミング手順は上記手順で問題ないのでし
        ょうか

以上です、ご教示頂ければ幸いです。


HogeHoge  2006-12-22 02:48:55  No: 97497

補足です。

>2.他アプリのウィンドウの座標情報を取得する

に関しましては、Win32APIのGetWindowRect関数を使用しています。

よろしくお願い致します。


大吉末吉  2006-12-22 04:12:26  No: 97498

HogeHoge さん  こんにちは。

逆に質問(確認)です。

> 1.他アプリのハンドルを取得する
ちゃんと、ハンドル(Windowハンドル?)が参照できている。(目的のアプリのハンドルに間違いない)ことは確認済みですか?

> 2.他アプリのウィンドウの座標情報を取得する
> に関しましては、Win32APIのGetWindowRect関数を使用しています。

取得できた座標情報が、想定していた値になっていることは確認済みですか?

> 3.Win32APIのMoveWindow関数で自アプリのウィンドウ表示を制御する
結局、どういう値を設定したんですか?

一応、現時点の情報から分かる限りでの回答です。

> 質問1.そもそも他のアプリのウィンドウと重ならないように制御する
>         ことは可能なのでしょうか

「他のアプリのウィンドウ」って言うのが、「特定の1ウィンドウ」の事なのか、
「画面表示されている全ウィンドウ」なのか、不明ですけど・・・

やってやれないことは無いのでは?

> 質問2.可能な場合、プログラミング手順は上記手順で問題ないのでし
>         ょうか

特に間違っているとは思いませんが・・・


HogeHoge  2006-12-22 18:29:27  No: 97499

大吉末吉さん  こんにちは。レスありがとうございます。

>> 1.他アプリのハンドルを取得する
>ちゃんと、ハンドル(Windowハンドル?)が参照できている。(目的のアプ>リのハンドルに間違いない)ことは確認済みですか?
>
>> 2.他アプリのウィンドウの座標情報を取得する
>> に関しましては、Win32APIのGetWindowRect関数を使用しています。
>
>取得できた座標情報が、想定していた値になっていることは確認済みです
>か?

ここまでは問題無いと認識しています。
自信が無いのが

>> 3.Win32APIのMoveWindow関数で自アプリのウィンドウ表示を制御する
>結局、どういう値を設定したんですか?

この点でして、現在は
    Call SetWindowPos(Me.hWnd, _
                    0, _
                    Me.Width / 2 + 他アプリのX中央座標, _
                    他アプリのY最下座標 + 100, _
                    Me.Width, _
                    Me.Height, _
                    SWP_NOSIZE)
このようにパラメータを設定してコールしています。
(※他アプリのウインドウの下に表示させようとしています。)

>> 質問1.そもそも他のアプリのウィンドウと重ならないように制御する
>>         ことは可能なのでしょうか
>
>「他のアプリのウィンドウ」って言うのが、「特定の1ウィンドウ」の事な>のか、
>「画面表示されている全ウィンドウ」なのか、不明ですけど・・・

失礼しました、特定の1ウィンドウのことです。
lHnd = FindWindow(vbNullString, 「他アプリのタイトル」)
で取得しています。

マズイところありましたらご指摘頂ければ幸いです。


HogeHoge  2006-12-22 18:33:39  No: 97500

すいません、間違えました(汗)
>> 3.Win32APIのMoveWindow関数で自アプリのウィンドウ表示を制御する
>結局、どういう値を設定したんですか?
    MoveWindow(Me.hWnd, _
               Me.Width / 2 + plngWindowCenterPosX, _
               plngWindowCenterPosY + 100, _
               Me.Width, _
               Me.Height, _
               1)
こうです。 

自信が無い点としまして、もう1点ほど追加させてください。
このMoveWindow関数のコール、自アプリのForm_Loadイベント内で行って
いるのですが、これは問題ないでしょうか?


通ってみた  2006-12-22 20:13:39  No: 97501

自アプリの表示位置だったら、APIではなくMe.Moveを使うとか、Me.LeftとMe.Topを変更するとかではダメなんでしょうか?


我龍院  2006-12-22 20:30:36  No: 97502

>plngWindowCenterPosX
>plngWindowCenterPosY
これが何者か書かれていないので何とも言えないのですが..
重ならないと言うことは、横に置くか、縦に置くか、斜めに
置くかですが、斜めに置くとすると
ScreeModeをピクセルに設定している場合は    
Call MoveWindow(Me.hwnd, _
               myRect.Right, _
               myRect.Bottom, _
               Me.ScaleWidth, _
               Me.ScaleHeight, _
               1)

ScreenModeがTwipのままなら
Call MoveWindow(Me.hwnd, _
               myRect.Right, _
               myRect.Bottom, _
               Me.Width / Screen.TwipsPerPixelX, _
               Me.Height / Screen.TwipsPerPixelY, _
               1)
となりますよね。

>自信が無い点としまして、もう1点ほど追加させてください。
>このMoveWindow関数のコール、自アプリのForm_Loadイベント内で行って
>いるのですが、これは問題ないでしょうか?
全然問題ないでしょう。


HogeHoge  2006-12-22 20:44:39  No: 97503

通ってみたさん、我龍院さん、こんにちは。レスありがとうございます。

>>plngWindowCenterPosX
>>plngWindowCenterPosY
>これが何者か書かれていないので何とも言えないのですが..

すみません、大変失礼しました。
plngWindowCenterPosX
plngWindowCenterPosY
他アプリのウィンドウの下中央のX、Y座標です。Win32APIのGetWindowRect
関数をコールして取得しました。というのは

>重ならないと言うことは、横に置くか、縦に置くか、斜めに
>置くかですが、斜めに置くとすると

推測させてしまいました(すみません)ように縦に置こうとしたためです。


HogeHoge  2006-12-22 20:59:17  No: 97504

ピクセルとtwipsとごっちゃにしていました(汗)。

座標(単位が違うことに注意しなければならないということ)を頭に入れて
いませんでした。

みなさん大変ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加