例えば、画面上の左上隅に既に開かれている他のアプリがあるとします。
そのアプリのウィンドウと重ならないように、自アプリのウィンドウを
表示させようと以下のようにプログラミングしてみました。
1.他アプリのハンドルを取得する
2.他アプリのウィンドウの座標情報を取得する
3.Win32APIのMoveWindow関数で自アプリのウィンドウ表示を制御する
現象
自アプリのウィンドウが表示されない
そこで質問です。
質問1.そもそも他のアプリのウィンドウと重ならないように制御する
ことは可能なのでしょうか
質問2.可能な場合、プログラミング手順は上記手順で問題ないのでし
ょうか
以上です、ご教示頂ければ幸いです。
補足です。
>2.他アプリのウィンドウの座標情報を取得する
に関しましては、Win32APIのGetWindowRect関数を使用しています。
よろしくお願い致します。
HogeHoge さん こんにちは。
逆に質問(確認)です。
> 1.他アプリのハンドルを取得する
ちゃんと、ハンドル(Windowハンドル?)が参照できている。(目的のアプリのハンドルに間違いない)ことは確認済みですか?
> 2.他アプリのウィンドウの座標情報を取得する
> に関しましては、Win32APIのGetWindowRect関数を使用しています。
取得できた座標情報が、想定していた値になっていることは確認済みですか?
> 3.Win32APIのMoveWindow関数で自アプリのウィンドウ表示を制御する
結局、どういう値を設定したんですか?
一応、現時点の情報から分かる限りでの回答です。
> 質問1.そもそも他のアプリのウィンドウと重ならないように制御する
> ことは可能なのでしょうか
「他のアプリのウィンドウ」って言うのが、「特定の1ウィンドウ」の事なのか、
「画面表示されている全ウィンドウ」なのか、不明ですけど・・・
やってやれないことは無いのでは?
> 質問2.可能な場合、プログラミング手順は上記手順で問題ないのでし
> ょうか
特に間違っているとは思いませんが・・・
大吉末吉さん こんにちは。レスありがとうございます。
>> 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, 「他アプリのタイトル」)
で取得しています。
マズイところありましたらご指摘頂ければ幸いです。
すいません、間違えました(汗)
>> 3.Win32APIのMoveWindow関数で自アプリのウィンドウ表示を制御する
>結局、どういう値を設定したんですか?
MoveWindow(Me.hWnd, _
Me.Width / 2 + plngWindowCenterPosX, _
plngWindowCenterPosY + 100, _
Me.Width, _
Me.Height, _
1)
こうです。
自信が無い点としまして、もう1点ほど追加させてください。
このMoveWindow関数のコール、自アプリのForm_Loadイベント内で行って
いるのですが、これは問題ないでしょうか?
自アプリの表示位置だったら、APIではなくMe.Moveを使うとか、Me.LeftとMe.Topを変更するとかではダメなんでしょうか?
>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イベント内で行って
>いるのですが、これは問題ないでしょうか?
全然問題ないでしょう。
通ってみたさん、我龍院さん、こんにちは。レスありがとうございます。
>>plngWindowCenterPosX
>>plngWindowCenterPosY
>これが何者か書かれていないので何とも言えないのですが..
すみません、大変失礼しました。
plngWindowCenterPosX
plngWindowCenterPosY
他アプリのウィンドウの下中央のX、Y座標です。Win32APIのGetWindowRect
関数をコールして取得しました。というのは
>重ならないと言うことは、横に置くか、縦に置くか、斜めに
>置くかですが、斜めに置くとすると
推測させてしまいました(すみません)ように縦に置こうとしたためです。
ピクセルとtwipsとごっちゃにしていました(汗)。
座標(単位が違うことに注意しなければならないということ)を頭に入れて
いませんでした。
みなさん大変ありがとうございました。
ツイート | ![]() |