powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / MsgBox поверх всех окон Windows
15 сообщений из 15, страница 1 из 1
MsgBox поверх всех окон Windows
    #35079439
part_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Настоящие программеры, подскажите!
У меня вот какая задача: работает программа и по завершении её работы появляется мэссэджбокс с надписью, например: "Работа программы закончена". НО его я вижу, если активно окно программы. А если я на момент окончания работы программы открыл другое приложение или окно моей программы находится в свёрнутом положении, или ... вобщем не видно окан проги, то как же мне увидеть это сообщение?
Как сделать так, чтоб МэссэджБокс выползал при каких либо обстоятельствах (даже если запущен проигрыватель или ещё что-нить)?
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35079454
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если программа твоя, в смысле есть исходный код, то переделываеш меседжбокс
на форму и делаеш её топмост

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35079472
part_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В смысле топмост?
Это в свойствах формы нада?
Не сердитесь, и не обращайте внимания на тупость, но где этот топмост ставить?
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35079623
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы выползал MsgBox "при каких либо обстоятельствах", вам не надо ничего делать. Т.е. абсолютно. Он (MsgBox) выползает, если просто к нему обратиться - чем вам не обстоятельство? Какое-либо.

Если же вы хотите, чтобы он (MsgBox) выползал при каких угодно обстоятельствах (почувствуйте разницу), то напишите свою форму, заменяющую MsgBox.

Для этого в модуле напишите:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Option Explicit

Public Declare Function SetWindowPos& Lib "user32" (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)

Const HWND_TOPMOST = - 1 
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2

Public Sub StayOnTop(ByRef objFrm As Form)

    SetWindowPos objFrm.hwnd, HWND_TOPMOST,  0 ,  0 ,  0 ,  0 , SWP_NOMOVE Or SWP_NOSIZE

End Sub

А в код такой формы добавьте:

Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Form_Resize()
    StayOnTop Me
End Sub

Private Sub Form_Deactivate()
    Me.SetFocus
End Sub

Тогда, если не видно "окан проги" (кстати, что это такое?), то сама форма должна стоять "on top".

Вот так над а !

Вопрос к Игорю Горбонос:

Что это такое: "переделываеш меседжбокс на форму и делаеш её топмост"? Это в какого языка?

Успехов!
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35079811
part_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите мне ещё раз. Значит есть вот такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Const olFolderCalendar =  9 
Const olFolderContacts =  10 
Const olFolderDeletedItems =  3 
Const olFolderDrafts =  16  '(&H10)
Const olFolderInbox =  6 
Const olFolderJournal =  11 
Const olFolderNotes =  12 
Const olFolderOutbox =  4 
Const olFolderSentMail =  5 
Const olFolderTasks =  13 
Const olPublicFoldersAllPublicFolders =  18  '(&H12)


Sub ReadBox()
    ListAllItemsInInbox_for_Outlook_macros (olFolderInbox)
End Sub
Sub ListAllItemsInInbox_for_Outlook_macros(BoxIndex)
Dim OLF As Object, CurrUser As String
Dim EmailItemCount As Integer, i As Integer, EmailCount As Integer
    
    MailInDir = "D:\Outlook\"
    Set OLF = GetObject("", "Outlook.Application").GetNamespace("MAPI").GetDefaultFolder(BoxIndex)
    EmailItemCount = OLF.Items.Count
    i =  0 : EmailCount =  0 
    
    While i < EmailItemCount
        i = i +  1 
        i1 =  0 
        With OLF.Items(i)
        If .UnRead Then
            While i1 < .Attachments.Count
                i1 = i1 +  1 
                .Attachments(i1).SaveAsFile MailInDir & .Attachments(i1).FileName
            Wend
           
        End If
        End With
    Wend
    Set OLF = Nothing
    UserForm1.Show
    
    
End Sub
И куда вы предлагаете вставить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Для этого в модуле напишите:

Option Explicit

Public Declare Function SetWindowPos& Lib "user32" (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)

Const HWND_TOPMOST = - 1 
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2

Public Sub StayOnTop(ByRef objFrm As Form)

    SetWindowPos objFrm.hwnd, HWND_TOPMOST,  0 ,  0 ,  0 ,  0 , SWP_NOMOVE Or SWP_NOSIZE

End Sub
?


чтобы не ломали долго себе голову над исходником, объясняю: это код для MS Outlook, при получении почты все вложения сохраняются в папку "Оутлук" и выдаётся на экране сообщение о том, что пришла почта (см. выше)
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35079869
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> чтобы не ломали долго себе голову над исходником, объясняю: это код
> для MS Outlook, при получении почты все вложения сохраняются в папку
> "Оутлук" и выдаётся на экране сообщение о том, что пришла почта (см. выше)

А когда и как вызывается код обработки вошедшей почты?

Вставить в отдельный модуль, можно тот в котором остальной код, но
нежелательно.

И из этого кода совсем не понятно, когда должен показыватся MsgBox, который
нужно заменить.

> Что это такое: "переделываеш меседжбокс на форму и делаеш её
> топмост"? Это в какого языка?
это "непереводимая игра слов на местном диалекте" (с) Бриллиантовая рука
:-)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35079893
part_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторИгорь Горбонос
MsgBox уже заменил.
Вот исходник, где был мессэджбокс
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Const olFolderCalendar =  9 
Const olFolderContacts =  10 
Const olFolderDeletedItems =  3 
Const olFolderDrafts =  16  '(&H10)
Const olFolderInbox =  6 
Const olFolderJournal =  11 
Const olFolderNotes =  12 
Const olFolderOutbox =  4 
Const olFolderSentMail =  5 
Const olFolderTasks =  13 
Const olPublicFoldersAllPublicFolders =  18  '(&H12)
Sub ReadBox()
    ListAllItemsInInbox_for_Outlook_macros (olFolderInbox)
End Sub
Sub ListAllItemsInInbox_for_Outlook_macros(BoxIndex)
Dim OLF As Object, CurrUser As String
Dim EmailItemCount As Integer, i As Integer, EmailCount As Integer
    
    MailInDir = "D:\Outlook"
    Set OLF = GetObject("", "Outlook.Application").GetNamespace("MAPI").GetDefaultFolder(BoxIndex)
    EmailItemCount = OLF.Items.Count
    i =  0 : EmailCount =  0 
    ' read e-mail information
    BoxText = "тра-ля-ля:" + Chr( 10 ) + Chr( 10 )
    While i < EmailItemCount
        i = i +  1 
       
        i1 =  0 
        With OLF.Items(i)
        If .UnRead Then
            While i1 < .Attachments.Count
                i1 = i1 +  1 
                .Attachments(i1).SaveAsFile MailInDir & .Attachments(i1).FileName
            Wend
           
           End If
        End With
    Wend
    Set OLF = Nothing
    MsgBox BoxText
    BoxText = BoxText + Chr( 10 ) & "Вложения распакованы в папку " + MailInDir + Chr( 10 )
    BoxText = "Письмо пришло"
    
End Sub

А вот, собственно, и как вызывается код обработки вошедшей почты
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  Private Sub Application_NewMail()
    
   ListAllItemsInInbox_for_Outlook_macros (olFolderInbox)
   End Sub
   Function sound(x0, x1, x2, x3)
   For i0 =  1  To x0
    
    For i1 =  1  To x1
        Beep
        For i2 =  1  To x2
       
        Next
        
    Next
    
    
    For i3 =  1  To x3
        q = q *  10000  /  20000 
    Next
Next
End Function
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35079929
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
part_ok...И куда вы предлагаете вставить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Для этого в модуле напишите:

Option Explicit

Public Declare Function SetWindowPos& Lib "user32" (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)

Const HWND_TOPMOST = - 1 
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2

Public Sub StayOnTop(ByRef objFrm As Form)

    SetWindowPos objFrm.hwnd, HWND_TOPMOST,  0 ,  0 ,  0 ,  0 , SWP_NOMOVE Or SWP_NOSIZE

End Sub
?...


Так в модуль вставить..., обычный, даже не в класс...
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35079938
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот здесь
http://www.developersdex.com/vb/message.asp?p=2677&r=6117943&page=2 можно
прочитать как получить HWND для UserForm. Потом немного переделать код
который дал VladConn, исправив функцию
Public Sub StayOnTop(ByVal hwnd As Long)

SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE

End Sub
и переписать то что было написанно Вами так
.......
Wend
Set OLF = Nothing
load UserForm1
здесь вставить код нахождения HWND для UserForm1
и вызвать функцию
имя модуля.StayOnTop найденный hwnd

End Sub

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35079940
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Что это такое: "переделываеш меседжбокс на форму и делаеш её
> топмост"? Это в какого языка?
это "непереводимая игра слов на местном диалекте" (с) Бриллиантовая рука
:-)

Posted via ActualForum NNTP Server 1.4

Попробую перевести : Заменяете MsgBox формой и делате ее "always on top".

"топмост" - недостаточно, надо "всегда топмост"

:0)
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35079946
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> > Что это такое: "переделываеш меседжбокс на форму и делаеш её
> > топмост"? Это в какого языка?
> это "непереводимая игра слов на местном диалекте" (с)
> Бриллиантовая рука
> :-)
>
> Попробую перевести : Заменяете MsgBox формой и делате ее "always on
> top".
это заархивированный вариант Вашего ответа чуть раньше

> "топмост" - недостаточно, надо "всегда топмост"

Согласен, но нужно же хоть что нибудь оставлять и разработчику ;-)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35080095
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А распростецкое MsgBox+vbSystemModal чем не устраивает?
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35082618
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА распростецкое MsgBox+vbSystemModal чем не устраивает?

Так це ж само собою....

Я посчитал, что там еще надо, чтобы форма приложения могла минимизироваться, оставляя сообщение поверх всего.
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35082764
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, вот что я раскопал на одном из британских форумов по вопросу vbSystemModal:

...it's important to be very careful when you use this, by the way. A good example of when Windows uses it is when you run low on memory (which happens when you do something like run AOL for three days straight). The idea is that the user will want to know this no matter what the application context, because this is a warning about a general system issue that could affect every application. If you are using this in an application context and taking over another application context, that's considered bad manners. On the other hand, bad manners are sometimes exactly what is required. Just not very often...

Я лично раньше и не задумывался об этой стороне дела. Там ребята как-то шугаются такого режима, мол, как правило, неудобно такое ставить. Интересно...
...
Рейтинг: 0 / 0
MsgBox поверх всех окон Windows
    #35083203
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уместность всяких действий зависит не только от правил, но и обстоятельств.

Лично я использовал vbSystemModal только в случаях межпрограммных взаимодействий, например с экселем, когда и в программе и в экселе идут какие-то процессы. Если произойдет ошибка в одном приложении, а активно другое, то MsgBox с сообщеним об ошибке заблокирует оба приложения и при отсутствии vbSystemModal не будет доступен для ответной реакции пользователя. Придется тыркаться между подвисшими окнами, пока волею винды это сообщение не проявится. А некоторые вообще могут не вкурить, что произошло, и прибить все через диспетчер задач.

On the other hand, bad manners are sometimes exactly what is required. Just not very often...Потпесалсо.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / MsgBox поверх всех окон Windows
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]