Тема: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI
Здравствуйте, гуру автохоткея, к вам взываю с мольбой, пожалуйста напишите функцию, которая будет менять активный монитор как реально, так и только в реестре без применения. (CDS_RESET CDS_NORESET CDS_UPDATEREGISTRY)
я нашел только нижеследующий код для винапи:
//manual gather - NewPrimary name ----------------------------------
WinApi.DISPLAY_DEVICE ddOne = new WinApi.DISPLAY_DEVICE();
ddOne.cb = Marshal.SizeOf(ddOne);
deviceID = 1;
WinApi.User_32.EnumDisplayDevices(null, deviceID, ref ddOne, 0);
string NewPrimary = ddOne.DeviceName;
WinApi.DEVMODE ndm6 = NewDevMode();
result = (WinApi.DisplaySetting_Results)WinApi.User_32.ChangeDisplaySettingsEx(NewPrimary,
ref ndm6, (IntPtr)null, (int)WinApi.DeviceFlags.CDS_SET_PRIMARY |
(int)WinApi.DeviceFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
Console.WriteLine("Action 3.2 result:" + result.ToString());
Еще инфа: You should set primary monitor position to (0,0) ChangeDisplaySettingsEx(deviceName, &deviceMode, NULL, CDS_SET_PRIMARY | CDS_UPDATEREGISTRY | CDS_NORESET, NULL) and correct set position other monitors (without intersections with another) using function ChangeDisplaySettingsEx(deviceName, &deviceMode, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL), than call ChangeDisplaySettingsEx(0,0,0,0,0);
Код оттуда же:
My code (set szDeviceName monitor primary):
Code Snippet
DEVMODE deviceMode;
deviceMode.dmSize = sizeof(DEVMODE);
deviceMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS;
DISPLAY_DEVICE DisplayDevice;
ZeroMemory(&DisplayDevice, sizeof(DISPLAY_DEVICE));
DisplayDevice.cb = sizeof(DisplayDevice);
for(int i = 0; EnumDisplayDevices(NULL, i, &DisplayDevice, 0); i++)
{
if(!(DisplayDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) && (DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
{
EnumDisplaySettings(DisplayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &deviceMode);
//--- switch monitor to primary ---
deviceMode.dmPosition.x -= deviceMode.dmPosition.x;
deviceMode.dmPosition.y -= deviceMode.dmPosition.y;
DWORD dwFlags = CDS_UPDATEREGISTRY | CDS_NORESET;
if (strcmp(szDeviceName, DisplayDevice.DeviceName) == 0)
dwFlags |= CDS_SET_PRIMARY;
ChangeDisplaySettingsEx((LPSTR)DisplayDevice.DeviceName, &deviceMode, NULL, dwFlags, NULL);
}
}
ChangeDisplaySettingsEx(0,0,0,0,0);
Еще нашел полезный код, там правда ищут разрешения монитора, там еще написан код CDS_SET_PRIMARY := 0x00000010
http://de.autohotkey.com/forum/post-33685.html#33685
И конечно верхом радости будет если оно будет еще и работать и под ХР и под 7
Для чего оно надо: чтобы запускать игрушки на определенном мониторе без ручного переключения и дергания иконок и панели задач туды сюды