Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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
как мне узнать handle главной формы программы

Через 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
И когда я получу хендл, куда мне его пристроить?

  1.             /* тут подставишь тот hWnd, который получишь через API */
  2.             int hWnd = 123456;
  3.  
  4.             /* NativeWindow реализует IWin32Window,
  5.              * поэтому создаем instance этого класса*/
  6.             IntPtr handle = new IntPtr(hWnd);
  7.             NativeWindow owner = NativeWindow.FromHandle(handle);
  8.  
  9.             /* Запускаешь свою форму и подсовываешь ей owner
  10.              * Разумеется форму надо создавать твою (с прицелом) */
  11.             Form form = new Form();
  12.             form.Show(owner);

Ответить

Номер ответа: 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
может ты не тот hWnd получил?

Нет, это вряд ли, я его беру таким образом (не так, как Вы скзали):
  1. Process.GetProcessesByName("hl2").GetValue(0).MainWindowHandle

Дает четырехзнычный integer, то, что он принадлежит нужному мне процессу можно проверить так:
  1. Process.GetProcessesByName("hl2").GetValue(0).MainWindowTitle

- дает Counter-Strike Source.
Что касается второго варианта, очень заинтерсовало, а можно по-подробнее, что теоретически должно быть? если это про всякого рода графику, может быть придумаю, что сделать, как-никак знакомая вещь )
P.S.: "...может ты не тот hWnd получилА )"

Ответить

Номер ответа: 11
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #11 Добавлено: 09.11.08 09:12
P.S.: "...может ты не тот hWnd получилА )"

Намек понял.. :-)

- дает Counter-Strike Source.

Это не показатель.. К примеру окно обычного блокнота состоит из 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-сайт: domkratt.com
 Профиль | | #14
Добавлено: 09.11.08 10:52
Father пишет:
подобные игрули используют прямой доступ к видеопамяти

Не совсем так. Лаеринг там конечно используется, но не совсем в той мере. Тут нужен обычный DirectX, ИМХО

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам