powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / XP + NT Service + "скрытое окно" - не видит WM_CLOSE
10 сообщений из 10, страница 1 из 1
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
    #39550527
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть приложение, MyProga.exe
Использует скрытую форму (надо!!!), вот таким хитрым кодом.
Код: vbnet
1.
2.
3.
4.
5.
  Sub Main()
...
    Form1 = New frm1
    Application.Run(Form1)
  End Sub


Для frm1
Код: vbnet
1.
2.
3.
4.
  Private Sub frm1_Load(sender As Object, e As EventArgs) Handles Me.Load
...
    Me.Visible = False ' +!!!! ShowInTaskBar = False + WindowState = Minimized (в конструкторе)
  End Sub



Может быть запущено как App, а может как сервис (через оболочку).
При закрытии сервиса оболочка-сервис в частности стучит по окнам (WM_CLOSE)
Код: vbnet
1.
2.
3.
4.
5.
...
Secondly NSSM will enumerate all windows created by the application and send them a WM_CLOSE message, requesting a graceful exit.

Thirdly NSSM will enumerate all threads created by the application and send
them a WM_QUIT message...



Это "Secondly" успешно используется в MyProga.exe, т.к. вызывает
Код: vbnet
1.
2.
3.
  Private Sub frm1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    код корректного завершения приложения
  End Sub



Теперь о проблеме.
На Win10 (и предположительно, не проверял, на всем что >=Vista) эта штука работает полностью корректно, т.е. "скрытое окно" получает от сервиса свое WM_CLOSE и прога корректно завершается с выполнением кода из Me.FormClosed

А вот на XP WM_CLOSE почему-то до окна не доходит , т.е. MyProga.exe конечно прибивается после паузы , но уже за счет "Thirdly NSSM will enumerate all threads created by the application ".
Чтоб получать WM_CLOSE на XP, можно полечить сделав окно "видимым" (т.е. убрать все хитрости описанные вначале).
Но мне так НЕ НАДО (видимое окно).

Т.е на XP имеем:
1) "Скрытое" окно будучи запущено как App получает WM_Close
2) "Скрытое" окно будучи запущено как NT Service НЕ получает WM_Close
3) НЕ скрытое окно будучи запущено как NT Service ПОЛУЧАЕТ WM_Close
4) Поведение не зависит от аккаунта, под которым NT Service запущен (LocalSystem, Network Service или от имени User).

Чего не хватает окну? Как полечить, чтоб сообщение проходило под сервисом для "скрытого" окна?

P.S. Недавно задавал чем-то похожий вопрос (успешно решенный)
Не могу убить прогу, если получилось так, что она запущена с правами админа (тот же юзер)
но там речь шла как раз о новых системах (Admin/не Admin),
а здесь речь именно о старом XP, и касается режима работы "под сервисом".
...
Рейтинг: 0 / 0
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
    #39550532
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Видимое, но за границей экрана, или в 1 пиксель не подходит?
...
Рейтинг: 0 / 0
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
    #39550536
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты же нашел решение через маилслоты, где права роли не играют. Развивай это решение, если проблема в том что повторный запуск не дает доступа к маилслоту, то просто не запускай и т.д. Не в ту сторону ты пошел.
...
Рейтинг: 0 / 0
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
    #39550540
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Не, не подходит.
В другом сервисе я вообще отказался из-за этого от "скрытия", но там всегда сервис, и всегда LocalSystem, при попытке "запустить мышкой" проверяется IsLocalSystem и если нет, то до-свидания, до запуска формы дело не доходит.

А здесь оно может запускаться под любым аккаунтом (в т.ч. как сервис),
но есть еще опция запуска "как приложение".
Те полу-фокусы что ты предлагаешь, не спасают от корректного "скрытого запуска" (т.е. будет мелькалка при запуске, на экране/в панели задач).
Единственный гарантированный трюк это
ShowInTaskBar = False + WindowState = Minimized (в конструкторе)
но этот трюк вот именно на XP и именно под сервисом создает условие для неполучения окном WM_CLOSE.
Можно убрать ShowInTaskBar = False (и сообщения под сервисом на XP заработают), но промелькнет на панели задач при попытке "запустить мышкой".

Я думаю должна быть какая-то API которая это "получение сообщений окном" на XP тупо восстановит (которую можно напр. засунуть в Form_Load).
...
Рейтинг: 0 / 0
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
    #39550542
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТы же нашел решение через маилслоты, где права роли не играют...
А причем тут mailslot-ы и права (для XP!!!)?
Через mailslot-ы я еще могу убить из своего другого процесса.
А здесь совершенно другая задача.
Код: vbnet
1.
2.
...
Secondly NSSM will enumerate all windows created by the application and send them a WM_CLOSE message, requesting a graceful exit.


NSSM - the Non-Sucking Service Manager - про мои mailslot-ы ничего не знает.
Stopping the service
--------------------
When stopping a service NSSM will attempt several different methods of killing
the monitored application, each of which can be disabled if necessary.

First NSSM will attempt to generate a Control-C event and send it to the
application's console. Batch scripts or console applications may intercept
the event and shut themselves down gracefully. GUI applications do not have
consoles and will not respond to this method.

Secondly NSSM will enumerate all windows created by the application and send
them a WM_CLOSE message, requesting a graceful exit.


Thirdly NSSM will enumerate all threads created by the application and send
them a WM_QUIT message, requesting a graceful exit. Not all applications'
threads have message queues; those which do not will not respond to this
method.

Finally NSSM will call TerminateProcess() to request that the operating
system forcibly terminate the application. TerminateProcess() cannot be
trapped or ignored, so in most circumstances the application will be killed.
However, there is no guarantee that it will have a chance to perform any
tidyup operations before it exits.
И здесь я как раз играю чисто на WM_CLOSE (CTRL_C я отключаю чтоб не тянул, т.к. консоли у меня нет).
...
Рейтинг: 0 / 0
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
    #39550548
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Dima TТы же нашел решение через маилслоты, где права роли не играют...
А причем тут mailslot-ы и права (для XP!!!)?
При том что проблема у тебя в правах. Повесь отдельный поток на прослушку маилслота "my_proga %d" где %d PID процесса, и по получению любого сообщения на маилслот убивай процесс изнутри. Получишь гарантированное убийство процесса без всяких заморочек с оконными очередями.
...
Рейтинг: 0 / 0
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
    #39550560
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Я с mailslot знаю как делать.

ты внимательно мой предыдущий пост прочитал? и первый тоже?
в данном случае мне надо именно словить WM_CLOSE

И это WM_CLOSE у меня не приходит при совокупности следующих условий
1) окно скрыто Me.Visible = False ' +!!!! ShowInTaskBar = False + WindowState = Minimized (в конструкторе)
2) MyProga.exe запущена "As Service"
3) OS = Windows XP

Убери любое условие (одно), приходит.
...
Рейтинг: 0 / 0
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
    #39550584
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, если из-под таймера послать WM_CLOSE самому себе
Код: vbnet
1.
PostMessage(Me.Handle, WM_CLOSE, 0, IntPtr.Zero)


то оно проходит в том числе в указанной ситуации:
1) XP 2) форма скрыта как указано 3) Запущено как служба
А вот сообщение от NSSM именно в этой ситуации не проходит.
Dima Tправа
И вот что там именно на XP с "правами" не так может быть?
И как эти права тогда полечить? К слову ф-ция ChangeWindowMessageFilter, о которой говорилось в упомятутой теме, она как бы к Висте относится, и здесь так понимаю что-то другое.
...
Рейтинг: 0 / 0
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
    #39550625
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я тут потыркался.
Вот так ловит WM_CLOSE под сервисом:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Private Sub frm1_Load(sender As Object, e As EventArgs) Handles Me.Load
...
    Me.Visible = False '+ ShowInTaskBar = False + WindowState = Minimized (в конструкторе)
  End Sub

  Private Sub frm1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    If sys_WinVista = False Then ' XP/2003
      ShowWindow(Me.Handle, SW_SHOW)
      ShowWindow(Me.Handle, SW_HIDE)
    End If
  End Sub


Причем переигрывать надо именно через API (через Me.Visible не сработает). Каких-либо дополнительных visual эффектов не наблюдается. SW_SHOW волшебным образом включает ловлю WM_CLOSE, SW_HIDE же необходимо чтобы убить уши в Alt-Tab (за которые форму можно вытащить на поверхность, если этого не сделать).
А на Win10 (предположительно начиная с висты) он и без этого переигрывания ловит.

Научного объяснения этому искать видимо бессмысленно.
.Net - создатели в принципе накотовасили и наизвращались, "запретив" изначально стартовать форму с Visible=False (не запрещено виндами и прекрасно реализовано в том же VB6). Посему только наугад кривой лопатой по кривым рукам, зафурычило и фиг с ним.
И слава богу frm1_Shown вызывается только один раз и не вызывает зацикливания из-за вызова SW_SHOW из-под себя.
...
Рейтинг: 0 / 0
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
    #39550628
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот так наверно правильнее, Shown не нужен:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
  Private Sub frm1_Load(sender As Object, e As EventArgs) Handles Me.Load
...
    Me.Visible = False '+ ShowInTaskBar = False + WindowState = Minimized (в конструкторе)
    If sys_WinVista = False Then
      ShowWindow(Me.Handle, SW_SHOW)
      ShowWindow(Me.Handle, SW_HIDE)
    End If
  End Sub
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / XP + NT Service + "скрытое окно" - не видит WM_CLOSE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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