是否有双屏或克隆的XP的桌面设置之间的改变C / C ++多显示器库? [英] Is there a c/c++ multi-monitor library for changing between XP's desktop setting of dualview or clone?

查看:185
本文介绍了是否有双屏或克隆的XP的桌面设置之间的改变C / C ++多显示器库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写一个应用程序,这将有助于其Windows XP中的在双屏或克隆桌面之间自动切换。该应用程序使用的图形用户界面的小wxWidgets的窗口。这将是不错的图形用户界面中的按钮,可以双屏显示之间轻松切换克隆。

I am writing an application where it would be helpful to automatically switch between having Windows XP's desktop in dualview or cloned. The application uses a small wxWidgets window for the GUI. It would be nice to have a button within the GUI that could easily switch between dualview and cloned.

有一个C / C ++库,可访问控制双屏或克隆的?

Is there a c/c++ library that gives access to controlling dualview or cloned?

推荐答案

以下code类作品。它不保持显示器的分辨率。

The following code sort of works. It doesn't keep the monitor resolution.

void AppFrame::OnButtonModify(wxCommandEvent& event)
{
  static bool bSwitch = false;

  if (bSwitch)
  {
    ExtendExternalDisplay();
  }
  else
  {
    CloneExternalDisplay();
  }
  bSwitch = !bSwitch;
}

void AppFrame::ExtendExternalDisplay() 
{

  int   nModeSwitch = NULL;
  DEVMODE dmPrimary, dmSecondary, dmThird, savedmSecondary;

#define szPrimaryDisplay TEXT( "\\\\.\\DISPLAY1" )
#define szSecondaryDisplay TEXT( "\\\\.\\DISPLAY2" )
#define szThirdDisplay TEXT( "\\\\.\\DISPLAY3" )

  ZeroMemory( &dmPrimary, sizeof(dmPrimary) );
  dmPrimary.dmSize = sizeof(dmPrimary);
  ZeroMemory( &dmSecondary, sizeof(dmSecondary) );
  dmSecondary.dmSize = sizeof(dmSecondary);
  ZeroMemory( &dmThird, sizeof(dmThird) );
  dmThird.dmSize = sizeof(dmThird);
  ZeroMemory( &dmThird, sizeof(dmThird) );
  dmThird.dmSize = sizeof(dmThird);

  BOOL result;
  HDC handle;
  DWORD iDevNum = 0;
  DWORD dwFlags = 0;
  DISPLAY_DEVICE lpDisplayDevice, lpDisplayDeviceOne, lpDisplayDeviceTwo;    
  ZeroMemory(&lpDisplayDevice, sizeof(lpDisplayDevice));       
  ZeroMemory(&lpDisplayDeviceOne, sizeof(lpDisplayDeviceOne));
  ZeroMemory(&lpDisplayDeviceTwo, sizeof(lpDisplayDeviceTwo));
  lpDisplayDevice.cb = sizeof(lpDisplayDevice);
  lpDisplayDeviceOne.cb = sizeof(lpDisplayDeviceOne);
  lpDisplayDeviceTwo.cb = sizeof(lpDisplayDeviceTwo);

  // All this does is confirm the number of display devices the graphics board is capable of handling
  while(EnumDisplayDevices(NULL, iDevNum, &lpDisplayDevice, dwFlags))
  {
    if (iDevNum == 0)
    {
      lpDisplayDeviceOne = lpDisplayDevice;
      TRACE("DeviceName:   '%s'\n", lpDisplayDeviceOne.DeviceName);
      TRACE("DeviceString: '%s'\n", lpDisplayDeviceOne.DeviceString);
      TRACE("Flags:        %08X %s%s\n", lpDisplayDeviceOne.StateFlags,((lpDisplayDeviceOne.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) ? "Desktop " : ""), ((lpDisplayDeviceOne.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) ? "Primary" : "")); 
    }

    if (iDevNum == 1)
    {
      lpDisplayDeviceTwo = lpDisplayDevice;
      TRACE("DeviceName:   '%s'\n", lpDisplayDeviceTwo.DeviceName);
      TRACE("DeviceString: '%s'\n", lpDisplayDeviceTwo.DeviceString);
      TRACE("Flags:        %08X %s%s\n", lpDisplayDeviceTwo.StateFlags,((lpDisplayDeviceTwo.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) ? "Desktop " : ""), ((lpDisplayDeviceTwo.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) ? "Primary" : "")); 
    }

    iDevNum ++;
  }  

  // load DISPLAY1 monitor information // ENUM_CURRENT_SETTINGS     
  if (!EnumDisplaySettings(szPrimaryDisplay, ENUM_REGISTRY_SETTINGS, (DEVMODE*)&dmPrimary))
  {
    TRACE("EnumDisplaySettings unable to enumerate primary display\n");
    return;
  }

  if (!EnumDisplaySettings(szSecondaryDisplay, ENUM_REGISTRY_SETTINGS, (DEVMODE*)&dmSecondary))
    TRACE("EnumDisplaySettings unable to enumerate secondary display display\n");

  // these don't enumerate in clone mode
  if (!EnumDisplaySettings(szSecondaryDisplay, ENUM_CURRENT_SETTINGS, (DEVMODE*)&savedmSecondary))  
    TRACE("EnumDisplaySettings unable to enumerate secondary display using ENUM_CURRENT_SETTINGS settings\n");

  // disable a display, doesn't work
  //    nModeSwitch = ChangeDisplaySettingsEx (szSecondaryDisplay, NULL, NULL, NULL, NULL);
  //    CDdx::ErrorDisplayDevice(nModeSwitch);                      // test and TRACE result

  dmPrimary.dmFields = DM_POSITION;
  dmPrimary.dmPosition.x = 0;           // set DISPLAY1 as the primary display
  dmPrimary.dmPosition.y = 0;           // set DISPLAY1 as the primary display

  // set DISPLAY1 as primary display (dmPosition.x = 0)
  nModeSwitch = ChangeDisplaySettingsEx (szPrimaryDisplay, (DEVMODE*)&dmPrimary, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
//  CDdx::ErrorDisplayDevice(nModeSwitch);                      // test and TRACE result

  // despite the other lines of code this next line is neccesary to wake the video projector
  dmSecondary = dmPrimary;

  dmSecondary.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
  dmSecondary.dmPosition.x = dmPrimary.dmPelsWidth + 1;
  dmSecondary.dmPosition.y = 0;
  dmSecondary.dmPelsWidth = dmPrimary.dmPelsWidth;          // resize the primary display to match the secondary display
  dmSecondary.dmPelsHeight = dmPrimary.dmPelsHeight;            // resize the primary display to match the secondary display    

  nModeSwitch = ChangeDisplaySettingsEx (szSecondaryDisplay, (DEVMODE*)&dmSecondary, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
//  CDdx::ErrorDisplayDevice(nModeSwitch);                      // test and TRACE result

  // load DISPLAY3 monitor information
  if (!EnumDisplaySettings(szThirdDisplay, ENUM_CURRENT_SETTINGS, (DEVMODE*)&dmThird))
  {
    TRACE("EnumDisplaySettings unable to enumerate third display display\n");
  }
  else
  {
    dmThird.dmPelsWidth = dmSecondary.dmPelsWidth;              // resize the primary display to match the secondary display
    dmThird.dmPelsHeight = dmSecondary.dmPelsHeight;            // resize the primary display to match the secondary display    
    dmThird.dmPosition.x = -dmThird.dmPelsWidth;                // set DISPLAY3 as the third display
    dmPrimary.dmPosition.y = 0;                                 // set DISPLAY1 as the third display

    // set DISPLAY3 as third display (-dmThird.dmPelsWidth)
    nModeSwitch = ChangeDisplaySettingsEx (szThirdDisplay, (DEVMODE*)&dmThird, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
//    CDdx::ErrorDisplayDevice(nModeSwitch);                        // test and TRACE result
  }

  // really important line makes the whole thing happen
  nModeSwitch = ChangeDisplaySettingsEx (NULL, NULL, NULL, 0, NULL);
//  CDdx::ErrorDisplayDevice(nModeSwitch);                          // test and TRACE result

}

void AppFrame::CloneExternalDisplay()
{
  int   nModeSwitch = NULL;
  DEVMODE dmPrimary, dmSecondary, dmThird;
#define szPrimaryDisplay TEXT( "\\\\.\\DISPLAY1" )
#define szSecondaryDisplay TEXT( "\\\\.\\DISPLAY2" )
#define szThirdDisplay TEXT( "\\\\.\\DISPLAY3" )

  ZeroMemory( &dmPrimary, sizeof(dmPrimary) );
  dmPrimary.dmSize = sizeof(dmPrimary);
  ZeroMemory( &dmSecondary, sizeof(dmSecondary) );
  dmSecondary.dmSize = sizeof(dmSecondary);
  ZeroMemory( &dmThird, sizeof(dmThird) );

  // load DISPLAY1 monitor information
  if (!EnumDisplaySettings(szPrimaryDisplay, ENUM_CURRENT_SETTINGS, (DEVMODE*)&dmPrimary))
  {
    TRACE("EnumDisplaySettings unable to enumerate primary display\n");
    return;
  }

  if (!EnumDisplaySettingsEx(szSecondaryDisplay, ENUM_REGISTRY_SETTINGS, (DEVMODE*)&dmSecondary, 0))
    TRACE("EnumDisplaySettings unable to enumerate secondary display display\n");

  dmPrimary.dmFields = DM_POSITION;
  dmPrimary.dmPosition.x = 0;                                   // set DISPLAY1 as the primary display
  dmPrimary.dmPosition.y = 0;                                   // set DISPLAY1 as the primary display

  // set DISPLAY1 as primary display (dmPosition.x = 0)
  nModeSwitch = ChangeDisplaySettingsEx (szPrimaryDisplay, (DEVMODE*)&dmPrimary, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
//  CDdx::ErrorDisplayDevice(nModeSwitch);                      // test and TRACE result

  // this should disable display
  dmSecondary.dmFields = DM_PELSWIDTH|DM_PELSHEIGHT;
  dmSecondary.dmPelsWidth = 0; //dmPrimary.dmPelsWidth;         // resize the primary display to match the secondary display
  dmSecondary.dmPelsHeight = 0;//dmPrimary.dmPelsHeight;            // resize the primary display to match the secondary display    

  // this should clone the display
  dmSecondary.dmFields |= DM_POSITION;
  dmSecondary.dmPosition.x = 0;         // set DISPLAY1 as the primary display
  dmSecondary.dmPosition.y = 0;         // set DISPLAY1 as the primary display

  nModeSwitch = ChangeDisplaySettingsEx (szSecondaryDisplay, (DEVMODE*)&dmSecondary, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
//  CDdx::ErrorDisplayDevice(nModeSwitch);                      // test and TRACE result

  nModeSwitch = ChangeDisplaySettingsEx (NULL, NULL, NULL, 0, NULL);                                    // set DISPLAY1 as the primary display
//  CDdx::ErrorDisplayDevice(nModeSwitch);                  // test and TRACE result    

}

这篇关于是否有双屏或克隆的XP的桌面设置之间的改变C / C ++多显示器库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆