Страница: 1 |
Страница: 1 |
Вопрос: Помогите в Visual Basic .NET 2005, формы...
Добавлено: 08.11.08 19:17
Автор вопроса: vbnetka
Необходимо совместить, насколько я понимаю, два разных типа рисования, Visual Basic'а и игры. при том, чтобы форма ложилась на изображение игры, что есть самое главное...
Лучше сразу поясню:
в игре иногда пропадает прицел, для исправления этой мелочи сделана маленькая легкая программка, состоящая из одной прозрачной формы, при загрузке которой с помощью painteventargs рисуется крест. Все прекрасно, topmost помещает её поверх всех окон и, казалось бы, проблем возникнуть уже не может, но как только запускается игра, прицел мой уходит назад. Самое интересное, если попросить форму отрефрешиться или вновь пойти на передний план, то так и происходит, только вот игра сворачиватся (. Как можно разрешить проблему?
P.S.: если что, игра стимовская, cs:s
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 08.11.08 20:27
Насколько я понимаю, игра тоже устанавливает свое окно в TopMost, а 2 окна на одном уровне быть не может, поэтому твоя форма и уходит назад. Попробуй найти Handle главного окна игры и установи его в качестве Owner'a ( или Parent) для своей формы с прицелом. По идее, должно помочь..
Номер ответа: 2
Автор ответа:
vbnetka
Вопросов: 3
Ответов: 37
Профиль | | #2
Добавлено: 08.11.08 20:39
а каким образом? и там и там ему нужна форма .. да и вряд ли поможет, ведь когда я даю своему прицелу TopMost во время запущенной игры, то он выходит вперед, при этом сворачивая саму игру. как показывает опыт, если уних у обоих был топмост, прицел должен был просто перекрыть программы под ним, а этого не происходит.
боюсь, тут не все так просто
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 08.11.08 20:50
В случае с Owner форма не нужна.. достаточно в методе Show передать IWin32Window, т.е. по сути handle главной формы игры. И вся фишка заключается в том, что для твоей формы TopMost устанавливать не нужно.. она и так будет поверх игры, и уйти под нее она никак не сможет (можешь провести эксперимент с 2 обычными формами).
Номер ответа: 4
Автор ответа:
vbnetka
Вопросов: 3
Ответов: 37
Профиль | | #4
Добавлено: 08.11.08 21:06
EROS, да я вообще-то это и имею ввиду.. как мне узнать handle главной формы программы, а точнее выразить его
Номер ответа: 5
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #5
Добавлено: 08.11.08 21:27
Через API можно узнать.. я так на помню, потому как юзаю редко, а справочника нету под рукой.. там в названии Window должно быть.. кажется EnumChildWindow и еще какая то для получения хендла главного окна. В любом случае сначала через Spy++ посмотри? чо там вообще за окна, а там уже определишься как получить handle.
Номер ответа: 6
Автор ответа:
vbnetka
Вопросов: 3
Ответов: 37
Профиль | | #6
Добавлено: 08.11.08 21:41
И когда я получу хендл, куда мне его пристроить? ведь если все верно, то в конечном результате мне нужно ввести IWin32Window
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 08.11.08 22:15
Номер ответа: 8
Автор ответа:
vbnetka
Вопросов: 3
Ответов: 37
Профиль | | #8
Добавлено: 08.11.08 23:32
EROS, спасибо, работает без ошибок, но ничего не дает.. увы.. боюсь, что дело в графике и что игра независимо от этого ложится поверх формы.. изначально мне хотелось узнать что-нибудь поближе именно графике, может быть в пропертисах проекта поменять
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 08.11.08 23:48
хм.. странно.. может ты не тот hWnd получил? в смысле не того окна..
Есть еще один вариант.. раз hWnd окна ты знаешь, значит сможешь получить hDC устройства.. Если удастся все это получить, то можно попробовать рисовать прям на самом контексте. Чисто теоритически я представляю как это сделать но на практике не приходилось..
Номер ответа: 10
Автор ответа:
vbnetka
Вопросов: 3
Ответов: 37
Профиль | | #10
Добавлено: 09.11.08 02:24
Нет, это вряд ли, я его беру таким образом (не так, как Вы скзали):
Дает четырехзнычный integer, то, что он принадлежит нужному мне процессу можно проверить так:
- дает Counter-Strike Source.
Что касается второго варианта, очень заинтерсовало, а можно по-подробнее, что теоретически должно быть? если это про всякого рода графику, может быть придумаю, что сделать, как-никак знакомая вещь )
P.S.: "...может ты не тот hWnd получилА )"
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 09.11.08 09:12
Намек понял..
Это не показатель.. К примеру окно обычного блокнота состоит из 2 child'ов.. и MainWindowHandle
даст указатель главного окна (с заголовком Блокнот-Безымянный), но на самом деле сообщения нужно посылать child'у с классом окна Edit и неимеющему заголовка. Так что повторюсь, возможно ты просто не тот hWnd используешь.
Второй вариант выглядит следующим образом:
Имея на руках handle нужного окна ты можешь через статический метод Graphics.FromHwnd создать объект Graphics и рисовать непосредственно на самом окне игры. Я ради эксперимента рисовал так на рабочем столе (Desctop), поэтому могу предположить что этот вариант может сработать. Но вот дальше начнутся танцы с бубном. Чтобы твое изображение не пропадало, тебе надо будет ставить hook на это окно и отлавливать WM_PAINT( аналог события Paint в котором ты рисовала) по которому и перерисовывать твое изображение.
P.S.Повторюсь, но это лишь цепочка логических рассуждений.. практически подобные трюки мне делать не доводилось.
Номер ответа: 12
Автор ответа:
Father
Вопросов: 0
Ответов: 159
Профиль | | #12
Добавлено: 09.11.08 09:28
Извините что прирываю, но подобные игрули используют прямой доступ к видеопамяти, т.н. оверлей.
Так что формы, девайс-контексты и пр. им по барабану.
Номер ответа: 13
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #13
Добавлено: 09.11.08 10:38
вполне может быть.. я такой вариант тоже не исключаю..
Номер ответа: 14
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #14
Добавлено: 09.11.08 10:52
подобные игрули используют прямой доступ к видеопамяти
Не совсем так. Лаеринг там конечно используется, но не совсем в той мере. Тут нужен обычный DirectX, ИМХО