Azazello писал(а):Aldep, мысль интересная. Правильно ли я понял: через SetWindowsHookEx, CreateRemoteThread->LoadLibrary, или CreateRemoteThread->WriteProcessMemory мы внедряем DLL (или прямо код в случае с WriteProcessMemory) и каким-то образом изменяем адреса GetDC и BeginPaint на наши, причём наши функции работают как hooks. Создаём своё окно из своей thread, и, далее, направляем нужный вывод туда... Звучит заманчиво, не спорю.
Вопросы:
1. Допустим мы нашли адреса GetDC и BeginPaint (user32.dll (?) mapped в одно и то же место). В запущенном процессе мы можем туда записывать? Я не пробовал никогда, какой-нибудь AccessViolation не выскочит?
2. Если мы туда запихнули наши функции, не возникнет ли проблемы с chess-прогой? То есть, наш GetDC должен вызвать нормальный GetDC и передать результат дальше, верно?
3. Не проще ли просто заменить EndPaint - chess-окно уже будет обновлено, и просто перекинуть содержимое в наше окно в этот момент?
4. Что делать с вводом в наше окно? Надо будет писать WndProc для нашего окна, чтобы двигать фигуры, и дублировать все сообщения в chess-прогу. Наверняка, chess-прога флаги выставляет когда фигура выбрана, так что все мышиные сообщения точно надо пересылать.
5. Нельзя ли hook WM_CREATE, WM_PAINT, WM_MOUSEMOVE etc, изменить размеры окна в WM_CREATE и надеяться, что chess-прога нормирует координаты на размеры окна. Кстати, chess-прога может быть нормирует всё на какие-нибудь зашитые константы, было бы ещё проще. Или я бред несу? Я никогда таких сложных hooks не пробовал...
1. GDI32. Да, память конечно read-only, но есть VirtualProtect()
2. Если хотим отображать изначальное окно тоже, то тогда да.
3. Тогда уже надо заменять и ReleaseDC тоже. Наверное можно.
4. Да, это я не упомянул, но это-то несложно. Просто все клавиатурные события и маштабированные мышиные пересылаются мелкому окну.
5. А кто его знает, как она нормирует? Скорее всего не на размер окна. Раз окно не позволяет делать себя больше определенного размера, то скорее всего фигуры хранятся как битмэпы и клетки тоже имеют фиксированные размеры под эти битмэпы.
На самом деле можно сделать проще, если предположить, что компьютеры сейчас сильно мощнее, чем те, на которые расчитана программа. Можно просто по таймеру вызывать скажем раз пять в секунду PrintWindow API и перерисовывать большое окно.
Тогда конечно мы можем терять или ухудшить качество анимации, но оно тут неважно.
Тогда не надо никаких хуков, просто пересылать клавиатурные, мышиные и Invalidate сообения изначальному окну.