Можно ли изменить происхождение дисплея? (Win32) - PullRequest
4 голосов
/ 01 марта 2011

У меня есть несколько приложений, которые я не могу изменить (нет источника), они жестко запрограммированы для рисования в 0,0.Обычно это не проблема, однако появился новый проект (киоск), где мне нужно нарисовать границу вокруг этих приложений.Я ищу способ изменить диапазон отображения:

X: 0 to 1200
Y: 0 to 900

на что-то вроде:

X: -100 to 1100
Y: -100 to 800

Я видел несколько функций на MSDN, таких как SetViewportExtEx, SetWorldTransform, которые соответствуютнужно, однако, если я правильно их понимаю, они не делают общесистемных изменений.Они предназначены только для текущего процесса.

Я программирую на C ++, но если в реестре / панели управления / и т.д. есть настройки, которые также будут работать.

Кто-нибудь еще делал что-то подобное?до?

Редактировать 1: позиция окна жестко запрограммирована на 0,0

Ответы [ 3 ]

1 голос
/ 01 марта 2011

Это может быть излишним, но если вы действительно хотите иметь полный контроль, вы всегда можете использовать перехват API для перехвата создания окна, перехватывая CreateWindow, CreateWindowEx в целевом процессе и изменяя координаты XY перед передачей управления обратно в систему.

Популярные библиотеки перехвата API включают в себя: Microsoft Detours , MadCi's MadCodeHook и бесплатный открытый код EasyHook .

.
0 голосов
/ 01 марта 2011

Не могли бы вы уточнить, что вы подразумеваете под «приложения жестко запрограммированы на 0,0»? Означает ли это, что положение их окон установлено в 0,0, или у них есть код для рисования в 0,0?

Решение № 1
Одним из возможных решений было бы использование SetWindowPosition, чтобы просто переместить каждое из приложений в любую нужную вам позицию.

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

Решение № 2
Установите рабочую область рабочего стола, чтобы быть меньше. Это должно заставить ваши приложения занимать рабочую область, а не весь экран. После этого вы сможете открыть любые дополнительные окна, расположить их вручную и нарисовать границу.

На самом деле вы можете рассмотреть возможность регистрации окон границ в виде «панелей приложений», которые автоматически изменят размер рабочей области.

0 голосов
/ 01 марта 2011

Я мог бы пойти по пути создания приложения оболочки с окном, а затем установить родительский элемент другого с помощью «SetParent»

например, в C # я сделал это ...

var info = new ProcessStartInfo {FileName = "NotePad.exe", WindowStyle = ProcessWindowStyle.Normal};
var runProcess = Process.Start(info);
Thread.Sleep(1000);  // ugly, but more just proving a point
SetParent(runProcess.MainWindowHandle, Handle);

и он разместил блокнот в моем окне форм

Итак, просто разместите окно, измените размер вашего хоста до размера + клиента, поместите клиента в окно хоста, где вы хотите, и затем нарисуйте его снаружи.

easy peasy:)

...