1 (изменено: BalRoG, 2012-03-18 20:21:22)

Тема: 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
Для чего оно надо: чтобы запускать игрушки на определенном мониторе без ручного переключения и дергания иконок и панели задач туды сюды

2

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Если карточка нвидиа, то для неё примочка есть - Nview.
Там можно выбирать какой софт на каком мониторе будет запускаться.
Поддержку её давно прекратили, но я на семёрку без особенных танцев поставил.
Если надо могу тебе залить архивчик.

3

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

OFF:

Malcev пишет:

Поддержку её давно прекратили,

Нет. Поддержка есть. Другое дело, что под Windows 7 с NView были определённые проблемы, и её убрали с какой-то версии драйверов из поставки.

4

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Скажите пожалуйста, я попросил слишком много? Или это трудно реализуемо? Или муторно?

5

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

А вы с какой целью интересуетесь? Дабы попросить о меньшем или более простом, или увлекательном?

6 (изменено: BalRoG, 2012-03-19 18:18:59)

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Чтобы ждать / не ждать помощи, а также ломать или не ломать голову в виду невозможности реализовать своими силами.

7

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

BalRoG пишет:

Чтобы ждать / не ждать помощи...

4.1

8 (изменено: BalRoG, 2012-03-20 01:41:59)

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Grey пишет:

4.1

BalRoG пишет:

Здравствуйте, гуру автохоткея, к вам взываю с мольбой

Где был хоть отдаленный намек на требовательный тон от меня?
Я спросил, может ли ктонить помочь с функцией, т.к. я не могу врубиться как правильно указать devMode, все время ChangeDisplaySettingsEx возвращает BAD_PARAM, а потом спросил совета, как вы думаете, сможет ли ктонибудь помочь. А тыкание в правила, как котенка в место куда он напИсал, только раздражает.

9

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

2All: будем считать, что все друг друга поняли.

10

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Все еще не получается решить задачу, помогите, пожалуйста

11

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

BalRoG пишет:

А тыкание в правила...

Да собственно не хотел раздражать, просто на высказывание типа:

BalRoG пишет:

Чтобы ждать / не ждать помощи...

хотел процитировать, что:

По теме, Ваш код из первого поста мягко говоря не полный, на C# выдаёт 0 - Successful, на АХК -2 Badmode:

DISP_CHANGE:={0:"SUCCESSFUL",  1:"RESTART"
           , -1:"FAILED"    , -2:"BADMODE"
           , -3:"NOTUPDATED", -4:"BADFLAGS"
           , -5:"BADPARAM"  , -6:"BADDUALVIEW"}

VarSetCapacity(DISPLAY_DEVICE, A_IsUnicode ? 840:424)
NumPut(A_IsUnicode ? 840:424, DISPLAY_DEVICE, 0) ; cb
VarSetCapacity(DEVMODE, A_IsUnicode ? 240:156, 0)
NumPut(A_IsUnicode ? 240:156, DEVMODE, 36, "Short") ; dmSize
NumPut(A_IsUnicode ? 240:156, DEVMODE, 40, "Short") ; dmDriverExtra

DllCall("EnumDisplayDevices"(A_IsUnicode ? "W":"A")
                           , "UInt", 0 ; lpDevice
                           , "UInt", deviceID:=1 ; iDevNum
                           , "UInt", &DISPLAY_DEVICE ; lpDisplayDevice
                           , "UInt", 0) ; dwFlags

NewPrimary:=StrGet(&DISPLAY_DEVICE+4) ; DeviceName

result:=DllCall("ChangeDisplaySettingsEx"(A_IsUnicode ? "W":"A")
                                        , "Str", NewPrimary ; lpszDeviceName
                                        , "Ptr", &DEVMODE ; lpDevMode
                                        , "UInt", 0 ; hwnd
                                        , "UInt", CDS_SET_PRIMARY:=0x10 ; dwflags
                                                | CDS_UPDATEREGISTRY:=1
                                        , "UInt", 0) ; lParam

For Key, Value In DISP_CHANGE
   If % Key=result
      MsgBox, 262144, % "Return code: "Key, % "DISP_CHANGE_"Value
ExitApp

И потом, на оффоруме уже есть реализация подобной идеи.

12

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Спасибо за ответ, боюсь, что был в том топике, пробовал скрипт, но он может что-то и включает выключает, но не делает какой-либо монитор основным, у меня так он совсем не работает, (Win7 x64 Unicode)
Вставленные мной скрипты в первом посте взяты с других сайтов, сам я их не писал.
А этот скрипт, который вы написали, он работает под х64? У меня ничего не происходит при его запуске..

13 (изменено: Grey, 2012-03-31 02:04:29)

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Использую х86 итерпретатор, запускается и на х64, дополните код строкой вида:


...
MsgBox, 262208,, % StrGet(&DISPLAY_DEVICE+4)
NewPrimary:=StrGet(&DISPLAY_DEVICE+4) ; DeviceName
...

...просто интересно.

14 (изменено: BalRoG, 2012-03-31 02:28:20)

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

MsgBox, 262208,, % StrGet(&DISPLAY_DEVICE+4)     на реальной винде моей выдает \\.\DISPLAY2 а на 32 битной виртуалке ХР \\.\DISPLAYV1

15

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Что только первое окно-уведомление, и всё?

16 (изменено: BalRoG, 2012-03-31 02:29:28)

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

да, или я не так / не туда вставил строчки

17

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Ну закомментируйте ExitApp в конце кода и в место него вставьте ListLines, и посмотрите, что вообще происходит по ходу выполнения.

18

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

А лучше всего, не ListLines, а ListVars, и выделив всё что написано в окне скопи-пастите сюда.

19

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Global Variables (alphabetical)
--------------------------------------------------
0[1 of 3]: 0
CDS_SET_PRIMARY[2 of 3]: 17
CDS_UPDATEREGISTRY[1 of 3]: 1
deviceID[1 of 3]: 1
DEVMODE[0 of 120]:  
DISP_CHANGE[Object]: 0x000000000069ACC0
DISPLAY_DEVICE[0 of 420]: ͈
ErrorLevel[1 of 3]: 0
Key[1 of 3]: 1
NewPrimary[12 of 63]: \\.\DISPLAY2
result[2 of 3]: -2
Value[7 of 63]: RESTART

20

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

result[2 of 3]: -2

Ну у меня тоже самое выдаёт.

21

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Да, вот не знаю что делать, почему этому devmode не нравятся параметры то? Может кто-нибудь знает?

22

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

Уважаемые форумчане, я так и не смог разобраться как переключать активный монитор на другой, либо с применением либо с записью в реестр, очень прошу, помогите

23 (изменено: serzh82saratov, 2013-06-13 09:56:00)

Re: AHK: Переключение активного монитора ChangeDisplaySettings CDS_SET_PRI

---

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui