1

Тема: AHK: Вызов диалога «Завершение работы Windows»

Задача. Программно вызвать диалог «Завершение работы Windows». (Его вид зависит от версии ОС и пользовательских настроек — например, в WinXP это окошко с тремя цветными кнопками, если используется экран приветствия, или с выпадающим списком, если используется классическое окно входа.)


Нашёл решение на VB:

'The following code snippet displays the "Shut Down Windows" dialog.
'Is uses undocumented API function in shell32.dll

Private Declare Sub ShutDownDialog Lib "shell32.dll" Alias "#60" (ByVal hwndOwner As Long)

Private Sub cmdShowShutDown_Click()
    ShutDownDialog hWnd
End Sub

С помощью RUNDLL32.EXE

rundll32 shell32,#60

функция #60 запускается, то же самое на AHK:

RunWait rundll32 shell32`,#60

но с помощью DllCall()

DllCall("shell32\#60")

ничего не происходит.
Почему? Какие ещё возможны решения (AHK не обязательно)?

--------------------

Да, я знаю, достаточно широко известны следующие два решения:

WinClose Program Manager

(или для большей надёжности

WinClose Program Manager ahk_class Progman ahk_exe explorer.exe

) и

ComObjCreate("Shell.Application").ShutdownWindows()

но они работают только при запущенном Проводнике.

2

Re: AHK: Вызов диалога «Завершение работы Windows»

wisgest пишет:

но с помощью DllCall()

DllCall("shell32\#60")

ничего не происходит.

Попробуйте так:

DllCall("shell32\" 0x60)
wisgest пишет:

Нашёл решение на VB:

На семёрке не работает.

wisgest пишет:

Программно вызвать диалог «Завершение работы Windows».

На семёрке удалось получить только два варианта:

http://content.screencast.com/users/teadrinker/folders/Images/media/c01850e6-2b48-47f0-b016-e4658698b19e/2013.12.28-01.08.37.6.jpg

и

http://content.screencast.com/users/teadrinker/folders/Images/media/738ac1f0-172c-4d4e-b742-5555318811bd/2013.12.28-01.09.29.8.jpg

Первый относится к процессу проводника. Второй можно получить через cmd или WinApi.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Вызов диалога «Завершение работы Windows»

Речь идёт именно о первом диалоге.

Вероятно, недочет в самом AHK, не позволяющий вызвать из библиотеки функцию с таким именем? ErrorLevel принимает значение -4:

-4: The specified function could not be found inside the DLL.

teadrinker пишет:

Попробуйте так:

DllCall("shell32\" 0x60)

Нет, то же самое. А откуда такое выражение? По-моему, это то же, что и

DllCall("shell32\0x60")
teadrinker пишет:

На семёрке не работает.

Возможно, на «семёрке» есть аналогичная функция с другим названием…

teadrinker пишет:

Первый относится к процессу проводника.

Ну, это ещё не значит, что его нельзя вызвать помимо проводника.
Например, нажав Ctrl-Alt-Del (если используется классическое окно входа в систему) вызвать диалог «Безопасность Windows» и нажать кнопку «Завершение работы...» (правда, в этом случае в вызванном диалоге нет кнопки «Справка»).

У меня также можно безо всякого проводника вызвать само окошко, но затем надо самому как-то обрабатывать код возврата:

result := DllCall("msgina\ShellShutdownDialog")
MsgBox %result%

4

Re: AHK: Вызов диалога «Завершение работы Windows»

wisgest пишет:

Вероятно, недочет в самом AHK, не позволяющий вызвать из библиотеки функцию с таким именем?

Да нет, это не имя, это просто порядковый номер функции в dll, скорее всего. Как вызвать по номеру в AHK пока способа не обнаружил.

wisgest пишет:

У меня также можно безо всякого проводника вызвать само окошко, но затем надо самому как-то обрабатывать код возврата:

result := DllCall("msgina\ShellShutdownDialog")
MsgBox %result%

Тоже в семёрке не работает. Но обработать код возврата не проблематично. Как вызвать полноценное окошко пока не нашёл, но скорее всего в XP и семёрке будет по-разному.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Вызов диалога «Завершение работы Windows»

teadrinker пишет:

Как вызвать по номеру в AHK пока способа не обнаружил.

А, хотя вот:

address := DllCall("GetProcAddress", Ptr, DllCall("LoadLibrary", Str, "Shell32", Ptr), UInt, 60, Ptr)
DllCall(address, UInt, 0)

Я думал, что #60 — это шестнадцатеричное . Параметр UInt, 0 методом тыка подобрал, без него не работало, у меня, по-крайней мере.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Вызов диалога «Завершение работы Windows»

Спасибо, работает!

teadrinker пишет:

Параметр UInt, 0 методом тыка подобрал, без него не работало, у меня, по-крайней мере.

Т.е. функция работает и на Win7?
(У меня работает независимо от наличия параметра и его значения.)

7

Re: AHK: Вызов диалога «Завершение работы Windows»

Работает, но только с параметром, в примере выше с rundll32 не работало.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Вызов диалога «Завершение работы Windows»

Функции, выполняемые через RunDll32, имеют 4 параметра. Вот пример:


HRESULT WINAPI LaunchINFSectionEx(
    HWND hwnd,
    HINSTANCE hInst,
    PSTR pszParams,
    INT nShow
);

Непосредственно в вызове rundll32.exe можно указать только третий, это список аргументов, который функция должна разобрать на отдельные аргументы. Остальные параметры подставляет сама rundll32.