不同系统上的多个监视应用程序

若要让多个 monitoraware 应用程序在具有和没有多个监视器支持的系统上运行,请将应用程序与 Multimon.h 链接。 还必须在一个 C 文件中定义COMPILE_MULTIMON_STUBS。 如果系统不支持多个监视器,则会从 GetSystemMetrics 返回默认值,并且多个监视器函数的作用就像只有一个显示器一样。 在多个监视器系统上,应用程序将正常工作。

由于负坐标在多监视器系统中很容易发生,因此应使用 GET_X_LPARAMGET_Y_LPARAM 宏检索打包在 lParam 中的坐标。

不要使用负坐标或大于 SM_CXSCREEN 的坐标,SM_CYSCREEN隐藏窗口。 使用这些限制进行隐藏的窗口可能会显示在另一台监视器上。 同样,请勿使用这些限制来保持窗口可见,因为这可能会导致窗口与主监视器对齐。 最好重新检查现有应用程序是否出现这些问题。 但是,通过在主监视器上运行应用程序或将主监视器保留在虚拟屏幕的左上角,可以最大程度地减少现有应用程序中的问题。

请注意,SM_CXMAXTRACK和SM_CYMAXTRACK是为桌面定义的,而不仅仅是一个监视器。 可能需要重新定义使用这些限制的 Windows。

父窗口或相关窗口可能与子窗口不在同一监视器上。 若要查找窗口的监视器,应用程序应使用 MonitorFromWindow 函数。

若要在所有监视器上显示屏幕保护程序,请链接到最新版本的 Scrnsave.lib。 否则,屏幕保护程序可能仅显示在主监视器上,并使其他监视器保持不变。 与最新 Scrnsave.lib 链接的屏幕保护程序将同时适用于单一和多个监视系统。 若要在每个监视器上使用不同的屏幕保护程序,请使用多个监视器函数单独处理每个监视器。

以绝对坐标向系统传送坐标的输入设备(如平板电脑)的光标输入仅限于主监视器。 若要在监视器之间切换平板电脑输入,请参阅 OEM 中的说明。

若要将以绝对坐标发送的鼠标输入映射到整个虚拟屏幕,请使用具有MOUSEEVENTF_ABSOLUTE和MOUSEEVENTF_VIRTUALDESKTOP的 INPUT 结构。

BitBlt 函数适用于多个监视系统。 但是,如果源和目标设备上下文不同, MaskBltPlgBltStretchBltTransparentBlt 函数将失败。