Вывод сообщения ???

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
4udik
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 25.01.2003 (Сб) 11:35
Откуда: Latvia

Вывод сообщения ???

Сообщение 4udik » 16.06.2003 (Пн) 20:42

Нужно вывести сообщение при работе других приложений , ДАЖЕ ИГР!
Кто-то может научить?

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Re: Вывод сообщения ???

Сообщение SergeySV » 17.06.2003 (Вт) 9:50

4udik писал(а):Нужно вывести сообщение при работе других приложений , ДАЖЕ ИГР!
Кто-то может научить?


Че-то я не понимаю, а разве обычное модальное диалоговое окошко (через MsgBox) не получит фокус не смотря на то, в какой ты программе до этого был.

P.S. Меня например постоянно выбрасывает из CS, если ты чего-нибудь параллельно перекачиваешь из сети, а связь обрывается и вылезает противная табличка. :(
Главное двигаться не быстрее, чем думает твоя голова.

4udik
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 25.01.2003 (Сб) 11:35
Откуда: Latvia

Сообщение 4udik » 17.06.2003 (Вт) 21:21

В том-то и дело , что при работе большенства игр вывод MsgBox проходит незамеченным.:(
Проблема в том , чтобы вывести окно сообщения во время игры , после убрать сообщение и чтобы игра корректно продолжила работу.
Сам добиться этого не могу.Либо все виснет намертво , либо сообщение просто не выводится.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 19.06.2003 (Чт) 16:30

4udik писал(а):В том-то и дело , что при работе большенства игр вывод MsgBox проходит незамеченным.:(
Проблема в том , чтобы вывести окно сообщения во время игры , после убрать сообщение и чтобы игра корректно продолжила работу.
Сам добиться этого не могу.Либо все виснет намертво , либо сообщение просто не выводится.


Сам конечно не все варианты не перебирал, но по сути, сделать так, чтобы фокус переходил на новое окно-сообщение из любой другой программы как-нибудь точно можно. Если говоришь, что обычное сообщение не всегда реагируют, то может ему через API SetFocus сделать или послать сообщение ontop и т.д..
Но бог с ним, с этим фокусом. Вот сделать так, чтобы потом фокус номана в программу вернулся и она не переглючила боюсь сделать будет невозможно :(, посколько это уже на совести программы. (Напримере в CS, после такого возврата звук обычно вылетает и курсор мышки мелькать на экране начинает).
Не совсем до конца понятно, что именно тебе нужно. Я так понял, вот что: играет чувак, играет, а твоя висящая в памяти прога, должна вывести сообщение, типа: "Хватит уже играть раздолбай. А хотя ладно, играй дальше" и убрать с экрана потом это сообщение, а чувак продолжать играть.... ?
Если так, то тогда мне видится другой путь. Надо показывать не окно (со всеми этими гемороими про фокус), а картинку, как это делают мультимедийные клавы. У них в дровах реализовано, что если ты например звук увеличиваешь, то он рисует свой прогрессбар и ему абсолютно пофигу в какой-то ты программе щас, он рисует прям на экране (:) не надо понимать меня буквально). Реализация этого подхода горазда проще и полная независимость, рисуй че хочешь.
Можно даже отлавливать нажатия мышки и клавы пользователем и когда он ткнет в табличку - убрать ее или еще что. Правда нажатие мышкой дойдут и до игры, но и это тоже можно обойти - просто после появления твоей таблички перехватывать движение мышки и клавы, чтобы они не доходили до других окон, а как нужное действие сделано возвращаем все обратно.
Главное двигаться не быстрее, чем думает твоя голова.

4udik
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 25.01.2003 (Сб) 11:35
Откуда: Latvia

Сообщение 4udik » 20.06.2003 (Пт) 21:52

Про причину вывода сообщения почти угадал!
И насчет всего остального я тоже согласен!
Но вот вопрос - КАК это зделать? Как там разобраться с мышкой и клавиатурой понятно,а вот как вывести картинку чтобы ее было видно во время игры?КОНКРЕТНО!.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 21.06.2003 (Сб) 17:00

4udik писал(а):Про причину вывода сообщения почти угадал!
И насчет всего остального я тоже согласен!
Но вот вопрос - КАК это зделать? Как там разобраться с мышкой и клавиатурой понятно,а вот как вывести картинку чтобы ее было видно во время игры?КОНКРЕТНО!.


Конкретно, хмм...
Я кое-что писал на эту тему, правда не испытывал это в таком аспекте, погодь немного, проверю дома кое-что...
Главное двигаться не быстрее, чем думает твоя голова.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 25.06.2003 (Ср) 14:14

Извиняй что не писал, делами завалили... :(

Ну, вообщем все работает. Тебе надо освоить рисование (в твоем случае на десктопе) API-функциями. Статей на эту тему достаточно много (под рисованием я имел ввиду - работу с контекстом устройства hDc, а в твоем случае можно не рисовать, а просто грузить BMP на десктоп), например: http://www.vbstreets.ru/default.asp?pag ... =vectorvb1

Только рисовать ты будешь не на hDc формы/picturebox, а на экране - DeskTopDc, который получается таким образом:
DeskTopDc = GetWindowDC(GetDesktopWindow)

Вот пример одной моей старой функции для рисования bmp в разных частях экрана:

Код: Выделить всё

А в форме, что-нибудь типа этого:

iPicContr = LoadPicture("C:\1.bmp")
DeskTopDc = GetWindowDC(GetDesktopWindow)
hBitDeskTop = CreateCompatibleBitmap(DeskTopDc, lx, ly)
ReleaseDC GetDesktopWindow, DeskTopDc

Call DrawBMPonDeskTop(fBool, hBitDeskTop, iPicContr, x, y, xOld, yOld, lx, ly)


А функция:

Public Sub DrawBMPonDeskTop(fBool As Boolean, ByVal hBitDeskTop As Long, iPicContr As IPictureDisp, x As Long, y As Long, xOld As Long, yOld As Long, lx As Long, ly As Long)
  ' Рисует на десктопе BMP, очищает предыдущее место рисования
  ' fBool  - False-рисуем 1 раз, стирать пока нечего, True-надо стереть bmp со старого места
   ' hBitDeskTop - кусок первонач. десктопа из-под нашего bmp
   ' iPicContr  - сама bmp картинка
   ' x, y - коорд. нового положения bmp на экране
   ' xOld, yOld - коорд. старого положения bmp на экране
   ' lx, ly - размер картинки

  Dim i As Long, k As Long
  Dim DeskTopDc As Long
  Dim memDC As Long              ' эквивалент. DeskTopDc в памяти
  Dim memDC2 As Long             ' эквивалент. DeskTopDc в памяти
  Dim hBmpPrev As Long, hBmpPrev2 As Long  ' старый растр
 
  ' получение дескриптора десктопа
  DeskTopDc = GetWindowDC(GetDesktopWindow)
 
  ' пол. эквивалент устройства DeskTopDc для памяти
  memDC = CreateCompatibleDC(DeskTopDc)
  ' выбираем нашу bmp в memDC2
  hBmpPrev = SelectObject(memDC, iPicContr.Handle)
 
  memDC2 = CreateCompatibleDC(DeskTopDc)
  ' выбираем битмап раб. стола в memDC2
  hBmpPrev2 = SelectObject(memDC2, hBitDeskTop)
 
  ' рисование
  If fBool Then   ' стираем старую картинку
    i = BitBlt(DeskTopDc, xOld, yOld, lx, ly, memDC2, 0, 0, SRCCOPY)
  End If
  ' сохраняем в выбранном hBitDeskTop новый фон под BMP
  i = BitBlt(memDC2, 0, 0, lx, ly, DeskTopDc, x, y, SRCCOPY)
 
  ' рисуем на декстопе BMP
  If x <> 0 And y <> 0 Then
      i = TransparentBlt(DeskTopDc, x, y, lx, ly, memDC, 0, 0, lx, ly, vbWhite)
      ' вместо TransparentBlt можно BitBlt использовать, но придется поколдовать с прозрачностью(конечно если у тебя прямоуг. картинка, то наплевать на прозрачность, используй BitBlt  копируя bmp как есть - SRCCOPY. Microsoft предупреждает что TransparentBlt  в Win98 может создать утечку памяти...;) )
  End If
   
   
  'Восстанавливаем старый растр
  SelectObject memDC, hBmpPrev
  SelectObject memDC2, hBmpPrev2
  ' Освобождаем
  DeleteDC memDC
  DeleteDC memDC2
  ReleaseDC GetDesktopWindow, DeskTopDc

End Sub

Главное двигаться не быстрее, чем думает твоя голова.

4udik
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 25.01.2003 (Сб) 11:35
Откуда: Latvia

Сообщение 4udik » 26.06.2003 (Чт) 0:15

Спасибо за совет!Картинка нормально выводится,НО.....
Во время игры картинка не статична. Т.Е. вывожу сообщение как ты
советовал,но следующий же кадр игры стирает его нафиг!:(
Так-что теперь проблема застопорить игру.Есть какие мысли?...

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 26.06.2003 (Чт) 10:06

4udik писал(а):Спасибо за совет!Картинка нормально выводится,НО.....
Во время игры картинка не статична. Т.Е. вывожу сообщение как ты
советовал,но следующий же кадр игры стирает его нафиг!:(
Так-что теперь проблема застопорить игру.Есть какие мысли?...


Если очень надо застопорить, то это через управлением процессами делается: всякими OpenProcess, Suspend....Resume... Тут я не силен, но наши зубры тебе подскажут...

А чтобы картинка сразу не стиралась в "динамичных" играх, надо просто самому ее почаще перерисовывать...
Главное двигаться не быстрее, чем думает твоя голова.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 30

    TopList