powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Иконка в трее + меню + Невидимая форма + SetForegroundWindow(Me.Handle) -глюки
4 сообщений из 4, страница 1 из 1
Иконка в трее + меню + Невидимая форма + SetForegroundWindow(Me.Handle) -глюки
    #38960633
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Основная форма приложения - невидима (с самого начала).
Реализовано так:
В конструкторе: ShowInTaskBar=False, WindowState=Minimized
Код: vbnet
1.
2.
3.
4.
  Private Sub frm1_Load(sender As Object, e As EventArgs) Handles Me.Load
...
    Me.Visible = False
  End Sub


(обсуждали как-то, этот трюк нормально работает)

В трей выведена иконка:
По науке, через NOTIFYICONDATA + Shell_NotifyIcon
(.Net-овский прибамбас мне не достаточен)

В качестве меню этой иконки используется контекстное меню menu_App (System.Windows.Forms.ContextMenu)

Меню выводится при нажатии правой кнопки мыши на иконку трея таким образом:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
      Case WM_MySysTrayNotify 'уведомления Tray -вместо WM_MOUSEMOVE
        Dim lw_lparam As Integer = LOWORD(m.LParam)
        Select Case lw_lparam
           Case WM_RBUTTONUP 'display popup menu
            'Debug.Print("WM_RBUTTONUP")
            SetForegroundWindow(Me.Handle)
            TrackPopupMenu(Me.menu_App.Handle, TPM_LEFTBUTTON,
             Control.MousePosition.X, Control.MousePosition.Y, 0, Me.Handle)



SetForegroundWindow(Me.Handle) нужна для того, чтобы меню закрывалось если пользователь щелкнул по рабочему столу, не выбрав ни одного пункта меню.

Проблема возникает если
1) пользователь выбрал пункт меню, который не приводит к "переводу фокуса" на какое-либо другое (видимое) окно
2) потом сразу случайно нажал ENTER

Также если пользователь
1) нажал ESC (меню закрылось) !!!но не ткнул по рабочему столу или другому окну
2) потом сразу нажал ENTER

В этом случае главная форма (которая Me.Visible = False) почему-то становится видимой.
Глюк неприятный, потому что форма чисто техническая.

Виновата очевидно SetForegroundWindow(Me.Handle), уже проверил.
Но без нее нельзя, меню не будет убираться, если ни один пункт не выбран.

Я так понимаю, что после выбора пункта меню надо сразу снять действие SetForegroundWindow(Me.Handle).
Как это сделать?


SetForegroundWindow function
(что-то наверно не догоняю)

В моем распоряжении:
Код: vbnet
1.
2.
      Case WM_EXITMENULOOP
        Debug.Print("WM_EXITMENULOOP")


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

(P.S. в VB6 аналогичная последовательность действий форму видимой не делает, т.е. глюк не воспроизводится)
...
Рейтинг: 0 / 0
Иконка в трее + меню + Невидимая форма + SetForegroundWindow(Me.Handle) -глюки
    #38960660
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При запуске из студии помогает:
Код: vbnet
1.
2.
      Case WM_EXITMENULOOP
         SetForegroundWindow(GetDesktopWindow())) 



При запуске exe это не срабатывает, SetForegroundWindow возвращает false при попытке перевести стрелки на Desktop
Странно, в .Net вроде "IDE" от "exe" не отличаются.

Других идей пока нет.

Пробовал еще
Код: vbnet
1.
2.
3.
      Case WM_EXITMENULOOP
        LockSetForegroundWindow(LSFW_UNLOCK))
        SetForegroundWindow(GetDesktopWindow())


LockSetForegroundWindow всегда возвращает false , соответственно бесполезно

Надо как-то снять Foreground с формы при выходе из меню
...
Рейтинг: 0 / 0
Иконка в трее + меню + Невидимая форма + SetForegroundWindow(Me.Handle) -глюки
    #38960685
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воспроизвел проблему на простом примере:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Class Form1

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Form2 As New frm2
    Form2.Show(Me)
  End Sub
End Class

Public Class frm2

  Private Sub frm2_Load(sender As Object, e As EventArgs) Handles Me.Load
    'В конструкторе: ShowInTaskBar=False, WindowState=Minimized 
    Me.Visible = False
    SetForegroundWindow(Me.Handle)
  End Sub
End Class



При нажатии на Button1 на Form1,
и последующем нажатии на клавишу ENTER

Form2 выводится на экран.
При этом ее .Net -свойство .Visible остается равным False (проверял).

Надо чтоб не выводилась.
...
Рейтинг: 0 / 0
Иконка в трее + меню + Невидимая форма + SetForegroundWindow(Me.Handle) -глюки
    #38960693
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  Public Const WM_QUERYOPEN = &H13

  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    'Debug.WriteLine(m.ToString())

    Select Case m.Msg
...
      Case WM_QUERYOPEN
        Debug.WriteLine("WM_QUERYOPEN")
        m.Result = New IntPtr(0) 'the window about to restore, should return FALSE to prevent from being opened
        Exit Sub
    End Select


    ' Forward message to base WndProc.
    MyBase.WndProc(m)
  End Sub


Ну, по крайней мере оно заткнулось.

Причина надо думать в идиотском высосанном из пальца "механизме", коим это окно скрывается при старте. Но .Net по другому не позволяет.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Иконка в трее + меню + Невидимая форма + SetForegroundWindow(Me.Handle) -глюки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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