0

この質問の言い方がよくわからないので、私の問題を説明するだけです。

私のVB 6プログラムは、画面の場所をレジストリに保存して、再度ロードしたときにデフォルトの場所を持つことができるようにします。これは期待どおりに機能しますが、問題が発生しました。2台のモニターを備えたコンピューターのセットアップがありました。ウィンドウを 2 番目の画面にドラッグし、翌日、2 番目のモニターのプラグを抜いた。プログラムをロードするたびにドックに表示されますが、フォーム自体は表示されませんでした。

セカンドモニターのスペースに隠れていると思いました(またはセカンドモニターはそうあるべきでした)最初にセカンドモニターを接続してそれを取り戻しましたが、表示されませんでした。モニターのセットアップは、メイン モニター (1) が新しいモニター (2) の左側にあるようにしました。(2)を(1)の左側にドラッグする必要があり、その時点でメインウィンドウにドラッグして戻すことができ、すべて正常に機能しました. これについて言及したのは、各モニター番号の解像度がそれ自体に関連していると考えたからです。マルチモニターは 1 つの巨大な座標面ですか?

私が知りたいのは、レジストリ (Form.left および Form.top) からロケーション番号を取得するときに、システムで利用できるものと照合する方法はありますか? これは大きな問題ではありませんが、クライアントから電話がかかってくることはわかっています。可能であれば、これらの呼び出しを避けたいと考えています。

皆さん、ありがとうございました

4

2 に答える 2

0

あなたの質問に対する答えではありませんが、将来同様の問題に対処したり、顧客が遭遇した場合に役立つ可能性があります。

タスクバー ボタンを右クリックすると (または Windows 7 では、ウィンドウの Aero Peek プレビューを右クリックすると)、 [移動] オプションが表示されます。それをクリックしてから、矢印キーのいずれかを押します。どちらでもかまいません。その後、ウィンドウは移動モードになり、マウスを動かすだけで出来上がり、画面に戻り、タイトル バーをドラッグしているかのように動作します。

于 2009-11-17T19:48:13.783 に答える
0

VB についてはわかりませんが、ネイティブの Win32 API を呼び出して問題に対処できます。

GetSystemMetrics(SM_CMONITORS) はモニターの数を返します。または、「実際の」モニターと疑似ディスプレイ モニターを区別する必要がある場合は、EnumDisplayMonitors() でそれらを列挙できます。

MonitorFromPoint() または MonitorFromRect() または MonitorFromWindow() を使用して、指定されたポイントでモニターを識別し、次に GetMonitorInfo() を使用して、そのモニターに関する情報 (仮想画面座標を含む) を返します。その後、選択したモニターにウィンドウを配置できます。

2 番目のモニターが見つからないか、電源がオフになっているかどうかを確実に検出する方法がわかりません。これにはセットアップ API (!) を使用できます。おそらく、SetupDiEnumDeviceInfo() を使用してモニター デバイスを列挙し、SetupDiGetDeviceRegistryProperty() を使用して、現在の電源状態などの情報を取得できます。

于 2009-11-17T20:20:13.427 に答える