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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
22.01.2008, 16:53
    #35079472
part_ok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MsgBox поверх всех окон Windows
В смысле топмост?
Это в свойствах формы нада?
Не сердитесь, и не обращайте внимания на тупость, но где этот топмост ставить?
...
Рейтинг: 0 / 0
22.01.2008, 17:31
    #35079623
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MsgBox поверх всех окон Windows
Чтобы выползал 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
22.01.2008, 18:23
    #35079811
part_ok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MsgBox поверх всех окон Windows
Помогите мне ещё раз. Значит есть вот такой код:
Код: 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
22.01.2008, 18:44
    #35079869
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MsgBox поверх всех окон Windows
> чтобы не ломали долго себе голову над исходником, объясняю: это код
> для MS Outlook, при получении почты все вложения сохраняются в папку
> "Оутлук" и выдаётся на экране сообщение о том, что пришла почта (см. выше)

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

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

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

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
22.01.2008, 18:56
    #35079893
part_ok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MsgBox поверх всех окон Windows
авторИгорь Горбонос
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
22.01.2008, 19:12
    #35079929
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MsgBox поверх всех окон Windows
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
22.01.2008, 19:16
    #35079938
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MsgBox поверх всех окон Windows
Вот здесь
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
22.01.2008, 19:17
    #35079940
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MsgBox поверх всех окон Windows
Игорь Горбонос
> Что это такое: "переделываеш меседжбокс на форму и делаеш её
> топмост"? Это в какого языка?
это "непереводимая игра слов на местном диалекте" (с) Бриллиантовая рука
:-)

Posted via ActualForum NNTP Server 1.4

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

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

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

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

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

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

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

Я посчитал, что там еще надо, чтобы форма приложения могла минимизироваться, оставляя сообщение поверх всего.
...
Рейтинг: 0 / 0
23.01.2008, 17:22
    #35082764
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MsgBox поверх всех окон Windows
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
23.01.2008, 20:00
    #35083203
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MsgBox поверх всех окон Windows
Уместность всяких действий зависит не только от правил, но и обстоятельств.

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

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


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