如何检查系统的可见分辨率

时间:2009-11-17 19:40:57

标签: registry position screen-resolution

我不完全确定如何解释这些问题所以我只是要解释我的问题。

我的VB 6程序将屏幕的位置保存在注册表中,这样当它再次加载时它可以有一个默认位置。这按预期工作,但我遇到了一个问题。我有一台带2台显示器的电脑。我将窗口拖到第二个屏幕,然后第二天我拔下第二个显示器。每次我加载程序时它都会出现在Dock中,但表单本身并没有。

我认为它隐藏在第二个显示器的空间(或者是第二个显示器应该是)。现在我开始连接第二个显示器以将其抓回,但它没有显示出来。监视器设置使得主监视器(1)位于新监视器(2)的左侧。我不得不将(2)拖到(1)的左边,此时它出现了,我能够将它拖回主窗口,一切正常。我提到这一点是因为我认为每个监视器编号的分辨率都与其自身有关。多监视器是一个巨大的坐标平面吗?

我想知道的是,当我从注册表中获取位置编号(Form.left和Form.top)时,有没有办法根据系统可用的内容进行检查?这不是一个大问题,但我知道我会让客户打电话,最后问:“它的装载,但我找不到它!”并且如果可能的话,我希望避免这些电话。

谢谢大家

2 个答案:

答案 0 :(得分:0)

对您的问题不是一个真正的答案,但它可能有助于处理将来遇到的类似问题,或者如果客户遇到问题可能会有所帮助。

如果右键单击任务栏按钮(或在Windows 7上,右键单击窗口的Aero Peek预览),您将看到移动选项。单击它,然后按下其中一个箭头键,无关紧要。之后,窗口将处于可移动模式,您只需移动鼠标即可,它会回到屏幕上,就像拖动标题栏一样。

答案 1 :(得分:0)

不了解VB,但您可以调用本机Win32 API来解决问题。

GetSystemMetrics(SM_CMONITORS)返回监视器的数量,或者如果需要区分“真实”监视器和伪显示监视器,可以使用EnumDisplayMonitors()枚举它们。

使用MonitorFromPoint()或MonitorFromRect()或MonitorFromWindow()在指定点识别监视器,然后使用GetMonitorInfo()返回有关该监视器的信息,包括其虚拟屏幕坐标。然后,您可以将窗口放在您选择的监视器上。

我不知道如何可靠地检测第二台显示器是否缺失或断电。您可以使用安装API(!),我怀疑 - SetupDiEnumDeviceInfo()可用于枚举监视器设备,SetupDiGetDeviceRegistryProperty()可用于检索有关每个的信息,如当前的电源状态。