|
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
|
|||
---|---|---|---|
#18+
Есть приложение, MyProga.exe Использует скрытую форму (надо!!!), вот таким хитрым кодом. Код: vbnet 1. 2. 3. 4. 5.
Для frm1 Код: vbnet 1. 2. 3. 4.
Может быть запущено как App, а может как сервис (через оболочку). При закрытии сервиса оболочка-сервис в частности стучит по окнам (WM_CLOSE) Код: vbnet 1. 2. 3. 4. 5.
Это "Secondly" успешно используется в MyProga.exe, т.к. вызывает Код: vbnet 1. 2. 3.
Теперь о проблеме. На 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, и касается режима работы "под сервисом". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2017, 19:51 |
|
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
|
|||
---|---|---|---|
#18+
Дмитрий77, Видимое, но за границей экрана, или в 1 пиксель не подходит? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2017, 20:04 |
|
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
|
|||
---|---|---|---|
#18+
Ты же нашел решение через маилслоты, где права роли не играют. Развивай это решение, если проблема в том что повторный запуск не дает доступа к маилслоту, то просто не запускай и т.д. Не в ту сторону ты пошел. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2017, 20:15 |
|
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
|
|||
---|---|---|---|
#18+
Petro123, Не, не подходит. В другом сервисе я вообще отказался из-за этого от "скрытия", но там всегда сервис, и всегда LocalSystem, при попытке "запустить мышкой" проверяется IsLocalSystem и если нет, то до-свидания, до запуска формы дело не доходит. А здесь оно может запускаться под любым аккаунтом (в т.ч. как сервис), но есть еще опция запуска "как приложение". Те полу-фокусы что ты предлагаешь, не спасают от корректного "скрытого запуска" (т.е. будет мелькалка при запуске, на экране/в панели задач). Единственный гарантированный трюк это ShowInTaskBar = False + WindowState = Minimized (в конструкторе) но этот трюк вот именно на XP и именно под сервисом создает условие для неполучения окном WM_CLOSE. Можно убрать ShowInTaskBar = False (и сообщения под сервисом на XP заработают), но промелькнет на панели задач при попытке "запустить мышкой". Я думаю должна быть какая-то API которая это "получение сообщений окном" на XP тупо восстановит (которую можно напр. засунуть в Form_Load). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2017, 20:25 |
|
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
|
|||
---|---|---|---|
#18+
Dima TТы же нашел решение через маилслоты, где права роли не играют... А причем тут mailslot-ы и права (для XP!!!)? Через mailslot-ы я еще могу убить из своего другого процесса. А здесь совершенно другая задача. Код: vbnet 1. 2.
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 я отключаю чтоб не тянул, т.к. консоли у меня нет). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2017, 20:36 |
|
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
|
|||
---|---|---|---|
#18+
Дмитрий77Dima TТы же нашел решение через маилслоты, где права роли не играют... А причем тут mailslot-ы и права (для XP!!!)? При том что проблема у тебя в правах. Повесь отдельный поток на прослушку маилслота "my_proga %d" где %d PID процесса, и по получению любого сообщения на маилслот убивай процесс изнутри. Получишь гарантированное убийство процесса без всяких заморочек с оконными очередями. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2017, 20:47 |
|
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
|
|||
---|---|---|---|
#18+
Dima T, Я с mailslot знаю как делать. ты внимательно мой предыдущий пост прочитал? и первый тоже? в данном случае мне надо именно словить WM_CLOSE И это WM_CLOSE у меня не приходит при совокупности следующих условий 1) окно скрыто Me.Visible = False ' +!!!! ShowInTaskBar = False + WindowState = Minimized (в конструкторе) 2) MyProga.exe запущена "As Service" 3) OS = Windows XP Убери любое условие (одно), приходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2017, 21:08 |
|
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
|
|||
---|---|---|---|
#18+
Ну, если из-под таймера послать WM_CLOSE самому себе Код: vbnet 1.
то оно проходит в том числе в указанной ситуации: 1) XP 2) форма скрыта как указано 3) Запущено как служба А вот сообщение от NSSM именно в этой ситуации не проходит. Dima Tправа И вот что там именно на XP с "правами" не так может быть? И как эти права тогда полечить? К слову ф-ция ChangeWindowMessageFilter, о которой говорилось в упомятутой теме, она как бы к Висте относится, и здесь так понимаю что-то другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2017, 21:55 |
|
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
|
|||
---|---|---|---|
#18+
Ну я тут потыркался. Вот так ловит WM_CLOSE под сервисом: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Причем переигрывать надо именно через API (через Me.Visible не сработает). Каких-либо дополнительных visual эффектов не наблюдается. SW_SHOW волшебным образом включает ловлю WM_CLOSE, SW_HIDE же необходимо чтобы убить уши в Alt-Tab (за которые форму можно вытащить на поверхность, если этого не сделать). А на Win10 (предположительно начиная с висты) он и без этого переигрывания ловит. Научного объяснения этому искать видимо бессмысленно. .Net - создатели в принципе накотовасили и наизвращались, "запретив" изначально стартовать форму с Visible=False (не запрещено виндами и прекрасно реализовано в том же VB6). Посему только наугад кривой лопатой по кривым рукам, зафурычило и фиг с ним. И слава богу frm1_Shown вызывается только один раз и не вызывает зацикливания из-за вызова SW_SHOW из-под себя. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2017, 00:56 |
|
XP + NT Service + "скрытое окно" - не видит WM_CLOSE
|
|||
---|---|---|---|
#18+
Ну вот так наверно правильнее, Shown не нужен: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2017, 01:08 |
|
|
start [/forum/topic.php?fid=20&fpage=37&tid=1399624]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 171ms |
0 / 0 |