Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Запуск программы и модальность окон


Автор: Juffin 26.5.2005, 11:34
Доброе время суток всем!
Есть программа, Main форма которой содержит только таймер и не отображается (hidden).
По таймеру программа проверяет всякие условия и по результатам проверки выводит (или не выводит) сообщение пользователю. Это сообщение очень желательно вывести модально для системы, или хотя бы поверх всех открытых окон. Я попробовал сделать форму для вывода этого сообщения, но она появляется не "наверху", а под другими окошками. Я пробовал для вывода сообщения использовать MsgBox (эта штука модальна, как нужно), но хитрые русские юзеры ловко обманывают программу - они не закрывают MsgBox, а просто перемещают его за пределы экрана и все - программа дальше не работает, а ждет ответа... В связи с этим вопрос к гуру:
Как же сделать, что бы форма открывалась "поверх" всех окон или как продолжить работу программы с незакрытым MsgBox? Или как программно закрыть этот MsgBox?
Всем заранее спасибо!

Автор: Mephisto 26.5.2005, 12:44
Цитата
BOOL SetWindowPos(          HWND hWnd,
    HWND hWndInsertAfter,
    int X,
    int Y,
    int cx,
    int cy,
    UINT uFlags
);

Код

SetWindowPos Me.hWnd,-1,0,0,0,0, &H1 or &H2

Автор: korob2001 26.5.2005, 12:50
Добавь в проект ещё одну форму, а на первую добавь кнопку. На событие кнопки кинь этот код.
Код

Private Sub Command1_Click()
    Form2.Show vbModal
End Sub

Думаю пояснять ничего не нужно.

Удачи.

Автор: Akina 26.5.2005, 13:42
А на зачем тебе Main-форма?
Сделай старт не формы, а Sub Main(). Будет проще контролировать действия юзера.
А еще по тому же таймеру можно сотворить
If Form.Visible=True Then Call RestorePositionAndModality()

Автор: Mephisto 27.5.2005, 06:11
Juffin, а зачем показывать MsgBox, если ты его программно собираешься закрыть?
Можешь с этого момента подробней?

Автор: Juffin 27.5.2005, 13:21
Цитата(Mephisto @ 27.5.2005, 06:11)
...а зачем показывать MsgBox, если ты его программно собираешься закрыть?

2Mephisto: На самом деле я использую MsgBox только потому, что он модален и выскакивает "поверх всех".

Добавлено @ 13:23
Цитата(Akina @ 26.5.2005, 13:42)
А на зачем тебе Main-форма?
Сделай старт не формы, а Sub Main().

2Akina: А как без формы работать с таймером? Мне нужно отслеживать произвольные промежутки времени (задается настройками).

Автор: Juffin 27.5.2005, 14:38
Цитата(Mephisto @ 26.5.2005, 12:44)

Код

SetWindowPos Me.hWnd,-1,0,0,0,0, &H1 or &H2

2Mephisto: А как в проекте VB объявить SetWindowPos?

Автор: __Sergey__ 27.5.2005, 15:01
Чтобы без формы использовать таймер надо юзать АПИ:
SetTimer and KillTimer

Автор: Mephisto 27.5.2005, 19:56
Есть специальная утилита для декларации функций АПИ. Лежит в пуске, возле самого ВБ в подкоталоге. Зайти в пуск, там найдешь. Нажмешь "загрузить файл", в разделе Declares наберешь SetWindowPos и запостишь это в раздел General. Короче, если никто не поможет, завтра напишу пример! smile

Автор: __Sergey__ 31.5.2005, 10:53
Код

Private Const HWND_TOPMOST As Long = -1


Private Declare Function SetWindowPos Lib "user32.dll" ( _
     ByVal hwnd As Long, _
     ByVal hWndInsertAfter As Long, _
     ByVal x As Long, _
     ByVal y As Long, _
     ByVal cx As Long, _
     ByVal cy As Long, _
     ByVal wFlags As Long) As Long

Private Sub Form_Load()
 SetWindowPos Me.hwnd, HWND_TOPMOST, 100, 100, 100, 100, 0
End Sub

Автор: Juffin 31.5.2005, 12:06
smile
Всем огромное спасибо!!!
Именно SetWindowPos сделала все, что мне нужно!
А вызывал я ее вот так:
Код

SetWindowPos Form.hwnd, -1, 0, 0, 0, 0, 67

Именно так окно не меняет ни размера, ни положения и вытаскивается "на самый верх".
Еще раз всем спасибо.

Автор: efedron 3.6.2005, 19:09
Mephisto
Цитата
SetWindowPos Me.hWnd,-1,0,0,0,0, &H1 or &H2

это все правильно, а как во время выполнения сделать окно неактивным (в соответствии с z-порядком)?

Автор: Akina 6.6.2005, 08:19
efedron
http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&article_num=002864
Значения флагов - очевидны (для знающих аглицкий) или подробнее в MSDN.

Автор: efedron 7.6.2005, 10:09
Akina
в том-то все и дело, что если сказать swp_noactive, а окно до этого уже было активным, то фокус оно не отдает smile попробуй, может у тебя получится;)

Автор: Akina 7.6.2005, 10:33
Цитата(efedron @ 7.6.2005, 11:09)
если сказать swp_noactive, а окно до этого уже было активным, то фокус оно не отдает

Ну ты дал... а с какого перепугу оно должно отдать фокус? и куда? это надо делать явно, руками...

Автор: efedron 7.6.2005, 15:40
Akina
мне надо чтоб окно программно отдало фокус другому окну, как будто бы пользователь нажал альт-таб

Автор: Akina 7.6.2005, 16:10
Ну и пошли в систему это нажатие - пусть сама разбирается...

Автор: efedron 7.6.2005, 21:38
Akina
тогда немножко проступет окошко выбора окон как при настоящем нажатии альт-таб

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)