Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с монитором не как частью рабочего стола  (Прочитано 18137 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Johnson
Гость
« : 05-03-2009 20:38 » new

Всем здраствуйте! Улыбаюсь

Вопрос скорее теоретический, ну по крайней мере пока.
Имеем Windows Vista с видеокартой ATI. К системе подлюченно два монитора, с первым вопросов нет. Вопрос со вторым Улыбаюсь
Как сделать так, чтобы монитор самой ОС не задействовался никак, т.е. не был частью рабочего стола, не был клоном, не гасился при запросе пароля пользователя и т.д.
Однако к нему нужен доступ из пользовательской программы. Доступ не сильно сложный - просто вывод растрового изображения.
Как такой вопрос решался бы во времена DOS в целом понятно - вывод в память видеоконторолера, а как это правильно делать сейчас?
В каком направлении вообще искать?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 05-03-2009 22:10 » 

Сейчас это называется DeviceContext, вот только предоставляется он системой, те монитор должен быть системе известен. Так что стандартными средствами - НИКАК. Всё что будет доступно пользовательской прожке - WinAPI и соответственно известные ресурсы.

А чем вызвано желание обеспечить перечисленные требования?

Доступ не сильно сложный - просто вывод растрового изображения.

О как. А что тогда называется сильно сложным доступом? Или что монитор ещё может делать, помимо вывода растрового изображения?

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 05-03-2009 22:47 » 

О как. А что тогда называется сильно сложным доступом? Или что монитор ещё может делать, помимо вывода растрового изображения?
Джон, ну Вы даете, букавки еще может показывать. Когда компьютер включаешь, он только букавки показывает. Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 06-03-2009 05:28 » 

Serg79, какие букафки ? У меня вот красивый синий экран с узорами. Очень стильно, включаю заместо ночного светильника. Искренне не понимаю, зачем для работы светильника нужен системный блок и бесперебойник Жаль(
Записан

Johnson
Гость
« Ответ #4 : 06-03-2009 06:06 » 

А чем вызвано желание обеспечить перечисленные требования?
Второй монитор - это монитор 800х600 на корпусе HTPC. Мне НЕ нужно расширять на него рабочий стол, НЕ нужно клонировать на него первичный монитор, НЕ нужно чтобы на него заходила мышь, НЕ нужно отображать окна, НЕ нужно его гасить при выводе сообщения от UAC, ну и все подобное Улыбаюсь Я просто хочу с ним работать как с неким массивом, и отображать несложную текстовую и графическую информацию. Если что-то мне в этом выводе поможет, отрендерить шрифты например, то хорошо, если нет, то и так пойдет....
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 06-03-2009 06:26 » 

Johnson,

из МСДН
Код:
The GetWindowDC function retrieves the device context (DC) for the entire window, including title bar, menus, and scroll bars. A window device context permits painting anywhere in a window, because the origin of the device context is the upper-left corner of the window instead of the client area. 

GetWindowDC assigns default attributes to the window device context each time it retrieves the device context. Previous attributes are lost.

HDC GetWindowDC(
  HWND hWnd   // handle to window
);
Parameters
hWnd
[in] Handle to the window with a device context that is to be retrieved. If this value is NULL, GetWindowDC retrieves the device context for the entire screen.
Windows 98/Me, Windows 2000/XP: If this parameter is NULL, GetWindowDC retrieves the device context for the primary display monitor. To get the device context for other display monitors, use the EnumDisplayMonitors and CreateDC functions.

Return Values
If the function succeeds, the return value is a handle to a device context for the specified window.

If the function fails, the return value is NULL, indicating an error or an invalid hWnd parameter.

Return Values
If the function succeeds, the return value is a handle to a device context for the specified window.

If the function fails, the return value is NULL, indicating an error or an invalid hWnd parameter.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks
GetWindowDC is intended for special painting effects within a window's nonclient area. Painting in nonclient areas of any window is not recommended.

The GetSystemMetrics function can be used to retrieve the dimensions of various parts of the nonclient area, such as the title bar, menu, and scroll bars.

The GetDC function can be used to retrieve a device context for the entire screen.

After painting is complete, the ReleaseDC function must be called to release the device context. Not releasing the window device context has serious effects on painting requested by applications.

GetWindowDC(0) вернёт нужный тебе контекст всего экрана
« Последнее редактирование: 06-03-2009 06:29 от Алексей1153++ » Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 06-03-2009 07:04 » 

Алексей1153++, иначе говоря, это второй десктоп и можно получить его handle? Вопрос другой: как?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #7 : 06-03-2009 07:21 » 

Johnson, смотри MSDN раздел Win 32 and COM Development->Graphics and Multimedia->Windows GDI->Multiple Display Monitors
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 06-03-2009 07:27 » 

Для данной задачи, думаю как вариант, рассматривать отдельный монитор, как внешнее устройство вывода.
Соответственно и софт/драйвера должны быть отдельные.

Т.е. драйвер монитора - но не привязанный к рабочему столу. Доступ на уровне портов.

вот только вопрос.
Что использовать? стандартный видеоконтроллер или свой?
Если стандартный, то нужно знать его внутренности - отключение прерываний/назначение своих, порты и прочее
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 06-03-2009 07:30 » 

Ром, да, это я не подумал. Я никогда не пробовал с двумя мониторами работать, щас поискал, вот так с ходу не нашёл, но интуиция подсказывает, что HDC просто расширяется на два монитора, а делить надо самому.
Записан

Johnson
Гость
« Ответ #10 : 06-03-2009 08:38 » 

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

Про GetWindowDC и "Win 32 and COM Development->Graphics and Multimedia->Windows GDI->Multiple Display Monitors" постараюсь сегодня посмотреть, но есть подозрение что не поможет...

Получатся, что вторичный монитор у ATI может быть в трех состояниях: disabled, extended, clone. Extended мне точно не подходит, поскольку расширяет на монитор рабочий стол. С clone я знаю единственный способ вывести не то что на основном мониторе, это вывод через DirectShow, но но при запросе пароля пользователя (смена пользователя или UAC) винда все равно его погасит. А вот можно ли вывести на disabled монитор???
Или может можно завести сессию другого пользователя и отдать ему второй монитор в полное распоряжение? На UNIX я о таком слышал, в винде нет. 
Записан
Johnson
Гость
« Ответ #11 : 06-03-2009 08:48 » 

А может существует готовый видеоадптер с готовыми драйверами, который позволил бы работать с монитором минуя GDI? Если проблему можно решить относительно небольшим количеством денег, то меня это устроит.
Пока я вижу только вариант взять какой-нибудь аппарат с WinCE и видеовыходом (на работе мы такие прогаем для пром автоматизации), засунуть его в корпус, передовать ему инфу по TCP, а он пусть то что запрограммим на монитор выводит.
Но как-то это дорого получается, в корпусе мало места, совершенно ни к чему лишнее тепловыделяющее устройство, да и вообще не спортивно Улыбаюсь
Записан
zubr
Гость
« Ответ #12 : 06-03-2009 08:51 » 

Цитата
Using Multiple Monitors as Independent Displays
When using multiple monitors as independent displays, the desktop contains one display or set of displays. This set of displays always includes the primary monitor and behaves as mentioned in the other sections of this topic. An application can use any other monitor as an independent display.

The window manager knows nothing about the independent displays. They are completely controlled by the application, and no window manager functions are available to the application (all window manager calls automatically go to the primary display). Each independent display has its own origin and horizontal and vertical coordinates, and is accessed through the GDI functions such as CreateDC or the DirectX functions such as DirectDrawCreate.

To locate the independent displays, call EnumDisplayDevices and look for the displays that do not have DISPLAY_DEVICE_ATTACHED_TO_DESKTOP flag in the DISPLAY_DEVICE structure.

An application can open a display by calling

hdc = CreateDC(lpszDisplayName, NULL, NULL, lpDevMode);
In this call, the lpszDisplayName parameter is one of the device names returned by EnumDisplayDevices and lpDevMode is a description of the graphics mode for this device. The resulting hdc can be used to perform any graphics operation to the device.
Цитата из msdn.
Если ты знаешь хендл монитора, то выводить туда можно все что хочешь.
Хендлы мониторов определяются функцией EnumDisplayMonitors (см. Multiple Display Monitors, msdn).
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 06-03-2009 08:52 » 

Johnson, есть растровые дисплеи с собственным контроллером и связью по USB или другому стандартному интерфейсу. Но думаю, что лучше почитать MSDN и разобраться, как использовать существующее оборудование.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Johnson
Гость
« Ответ #14 : 06-03-2009 09:02 » 

Согласен, хотелось бы использовать существующие оборудование. Вопрос скорее не денег, а отсутствия желания и времени дорабатывать корпус напильником, но и зря тратиться тоже не хочется Улыбаюсь

С EnumDisplayMonitors я работал, цитата из MSDN вроде о том, что надо. Zubr спасибо! И остальным тоже! Осталось только попробовать Улыбаюсь
Записан
Johnson
Гость
« Ответ #15 : 08-03-2009 14:27 » 

Попробовал. Полный провал  Жаль

Нашел вот такой примерчик Independent Displays. Вроде полностью, то что надо.

Немного переделал (извиняюсь, что на Delphi, но дома нет VS, а на работе нет второго монитора):
Код:
procedure TForm1.FormCreate(Sender: TObject);
const
  ENUM_CURRENT_SETTINGS = -1;
  ENUM_REGISTRY_SETTINGS = -2;
var
  dm: DEVMODE;
  dc: HDC;
  oldBrush: HBRUSH;
  LastError: Cardinal;
begin
  Memo1.Clear;

  ZeroMemory(@dm, sizeof(dm));
  dm.dmSize := sizeof(dm);
  EnumDisplaySettings('\\.\DISPLAY2', Cardinal(ENUM_REGISTRY_SETTINGS), dm);
  dc := CreateDC('\\.\DISPLAY2', nil, nil, @dm);
  if (dc = 0) then
    begin
    LastError := GetLastError();
    Memo1.Lines.Add(SysErrorMessage(LastError) + ' (' + IntToStr(LastError) + ')');
    end;
  oldBrush := SelectObject(dc, GetStockObject(WHITE_BRUSH));
  Rectangle(dc, 0, 0, dm.dmPelsWidth, dm.dmPelsHeight);
  MoveToEx(dc, 0, 0, nil);
  LineTo(dc, dm.dmPelsWidth, dm.dmPelsHeight);
  SelectObject(dc, oldBrush);
  DeleteDC(dc);
end;

В случае если второй монитор Extended то все работает, но Extended это совсем не независимый монитор...
В случае если монитор Clone или Disabled, CreateDC() возвращает ноль, GetLastError() возвращает ERROR_NOT_READY.
Таже картина если повесить второй монитор на физически отдельную видеокарту (тоже ATI), только топерь режим Clone вообще не доступен. После выставления новых режимов всегда перезагружал систему.

И похоже я в этом не одинок CreateDC fails on an independent display. Правда у него виста 64, у меня 32...

Какие будут предложения?
« Последнее редактирование: 08-03-2009 17:30 от Johnson » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines