1

Тема: AHK: Отправка оконного сообщения

Возможно как то отправить оконное сообщение, из скрипта с меньшими правами чем принимающий?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Отправка оконного сообщения

UIA?

3

Re: AHK: Отправка оконного сообщения

Не очень вникал в это, казалось что оно именно от админа работает.
Это про файл AutoHotkeyU32_UIA.exe?
Я запускаю из AHK_H, Dll или ехе. В ехе попробовал в манифест прописать <v3:requestedExecutionLevel level="asInvoker" uiAccess="true"/>, не помогло. С длл не ясно что делать.
Это как то можно в коде анк прописать?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Отправка оконного сообщения

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Отправка оконного сообщения

Тебе нужно ChangeWindowMessageFilter или ChangeWindowMessageFilterEx.

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

6

Re: AHK: Отправка оконного сообщения

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

Насчёт UIA конечно по прежнему интересно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Отправка оконного сообщения

serzh82saratov пишет:

Насчёт UIA конечно по прежнему интересно.

Ещё и в контексте установки хоткеи, которые аналогично не работают.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: Malcev, 2025-04-29 16:03:29)

Re: AHK: Отправка оконного сообщения

Там нужно ещё сертификат покупать и подписывать созданные экзешники.
https://habr.com/ru/companies/tuthost/articles/152867

9

Re: AHK: Отправка оконного сообщения

Спасибо, в общем слишком серьёзно всё. Для хоткеев вариантов нет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Отправка оконного сообщения

Ну можно хакерским способом:
https://forum.script-coding.com/viewtopic.php?id=17864

11

Re: AHK: Отправка оконного сообщения

Да, но

(нужно запускать скрипт от имени администратора):

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: Отправка оконного сообщения

Если ничего запускать от имени админа нельзя, то не выйдет.
Автор с автоит пишет:

This UDF requires administrator privileges, but you can still use it to create a process with standard user privileges and uiaccess attributes

13 (изменено: serzh82saratov, 2025-05-17 18:02:34)

Re: AHK: Отправка оконного сообщения

Malcev пишет:

Если ничего запускать от имени админа нельзя

Можно.

Так, может я не вкурил, есть скрипт который должен работать без прав админа, то есть вместо него можно что то сначала запустить с правами админа, и оно как то его так запустит без прав админа, таким образом что вопрос с хоткеями решится?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Отправка оконного сообщения

Можно так попробовать:

scriptToRunWithUIAccess := "D:\OneDrive\Scripts\_Разработка\New7.ahk"

RunAsAdmin()
RunWithUiAccess()
ShellRunAsUser(A_AhkPath, scriptToRunWithUIAccess)

RunAsAdmin(exitIfNotAdmin := false) {
    commandLine := DllCall("GetCommandLine", "str")
    isRestarted := !!RegExMatch(commandLine, " /restart(?!\S)")

    while !( A_IsAdmin || isRestarted ) {
        try Run, % "*RunAs " . (A_IsCompiled ? """" . A_ScriptFullPath . """ /restart"
            : """" . A_AhkPath . """ /restart """ . A_ScriptFullPath . """")
        catch
            break
        ExitApp
    }
    if !A_IsAdmin  {
        MsgBox, Failed to run the script as admin!
        if exitIfNotAdmin
            ExitApp
    }
}

RunWithUiAccess()
{
    Gui, +HWNDhGui +AlwaysOnTop
    DllCall("GetWindowBand", "uptr", hGui, "uint*", band)
    Gui, Destroy
    if (band != 1)
        return

    if !DllCall("advapi32\LookupPrivilegeValueW", "ptr", 0, "str", "SeTcbPrivilege", "int64*", luid)
    {
        msgbox LookupPrivilegeValueW error`n%A_LastError%
        exitapp
    }
    VarSetCapacity(PRIVILEGE_SET, 20, 0)
    NumPut(1, PRIVILEGE_SET, 0, "uint")
    NumPut(PRIVILEGE_SET_ALL_NECESSARY := 1, PRIVILEGE_SET, 4, "uint")
    NumPut(luid, PRIVILEGE_SET, 8, "int64")
    DllCall("advapi32\OpenProcessToken", "ptr", DllCall("GetCurrentProcess", "ptr"), "uint", 0x0008|0x0002, "ptr*", hTokenSelf)   ; TOKEN_QUERY|TOKEN_DUPLICATE
    DllCall("advapi32\GetTokenInformation", "ptr", hTokenSelf, "uint", 12, "uint*", TokenSelfSessionId, "uint", 4, "uint*", ReturnLength)
    hSnapshot := DllCall("CreateToolhelp32Snapshot", "uint", TH32CS_SNAPPROCESS := 0x00000002, "uint", 0, "ptr")
    VarSetCapacity(PROCESSENTRY32, A_PtrSize*3 + 544, 0)
    NumPut(A_PtrSize*3 + 544, PROCESSENTRY32, 0, "uint")
    loop
    {
        if (A_Index = 1)
            hr := DllCall("Process32FirstW", "ptr", hSnapshot, "ptr", &PROCESSENTRY32)
        else
            hr := DllCall("Process32NextW", "ptr", hSnapshot, "ptr", &PROCESSENTRY32)
        if !hr
            break
        if (StrGet(&PROCESSENTRY32 + A_PtrSize*2 + 28, "utf-16") = "winlogon.exe")
        {
            hProcess := DllCall("OpenProcess", "uint", PROCESS_QUERY_LIMITED_INFORMATION := 0x1000, "int", false, "uint", NumGet(PROCESSENTRY32, 8, "uint"), "ptr")
            DllCall("advapi32\OpenProcessToken", "ptr", hProcess, "uint", 0x0008|0x0002, "ptr*", hToken)   ; TOKEN_QUERY|TOKEN_DUPLICATE
            DllCall("advapi32\PrivilegeCheck", "ptr", hToken, "ptr", &PRIVILEGE_SET, "int*", pfResult)
            if pfResult
            {
                DllCall("advapi32\GetTokenInformation", "ptr", hToken, "uint", 12, "uint*", TokenSessionId, "uint", 4, "uint*", ReturnLength)
                if (TokenSessionId = TokenSelfSessionId)
                {
                    DllCall("advapi32\GetTokenInformation", "ptr", hToken, "uint", 1, "ptr", 0, "uint", 0, "uint*", ReturnLength)
                    VarSetCapacity(TokenUser, ReturnLength, 0)
                    DllCall("advapi32\GetTokenInformation", "ptr", hToken, "uint", 1, "ptr", &TokenUser, "uint", ReturnLength, "uint*", ReturnLength)
                    if DllCall("advapi32\IsWellKnownSid", "ptr", NumGet(TokenUser), "uint", WinLocalSystemSid := 22)
                        DllCall("advapi32\DuplicateTokenEx", "ptr", hToken, "uint", TOKEN_IMPERSONATE := 0x0004, "ptr", 0, "int", SecurityImpersonation := 2, "int", TokenImpersonation := 2, "ptr*", hTokenSystem)
                }
            }
            DllCall("CloseHandle", "ptr", hProcess)
            DllCall("CloseHandle", "ptr", hToken)
        }
    } until hTokenSystem
    DllCall("CloseHandle", "ptr", hSnapshot)
    if !hTokenSystem
    {
        msgbox RunWithUiAccess error
        exitapp
    }
    DllCall("advapi32\SetThreadToken", "ptr", 0, "ptr", hTokenSystem)
    DllCall("advapi32\DuplicateTokenEx", "ptr", hTokenSelf, "uint", 0x0008|0x0002|0x0001|0x0080, "ptr", 0, "int", SecurityAnonymous := 0, "int", TokenPrimary := 1, "ptr*", hTokenUIAccess)   ; TOKEN_QUERY|TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_ADJUST_DEFAULT
    DllCall("advapi32\SetTokenInformation", "ptr", hTokenUIAccess, "uint", TokenUIAccess := 26, "uint*", true, "uint", 4)
    DllCall("advapi32\RevertToSelf")
    DllCall("CloseHandle", "ptr", hTokenSystem)
    DllCall("CloseHandle", "ptr", hTokenSelf)
    VarSetCapacity(PROCESS_INFORMATION, A_PtrSize*2 + 8, 0)
    VarSetCapacity(STARTUPINFO, A_PtrSize*9 + 32, 0)
    NumPut(A_PtrSize*9 + 32, STARTUPINFO, 0, "uint")
    DllCall("GetStartupInfo", "ptr", &STARTUPINFO)
    DllCall("advapi32\CreateProcessAsUserW", "ptr", hTokenUIAccess, "ptr", 0, "wstr", DllCall("GetCommandLineW", "wstr"), "ptr", 0, "ptr", 0, "int", 0, "uint", 0, "ptr", 0, "wstr", A_ScriptDir, "ptr", &STARTUPINFO, "ptr", &PROCESS_INFORMATION)
    DllCall("CloseHandle", "ptr", NumGet(PROCESS_INFORMATION, 0, "ptr"))
    DllCall("CloseHandle", "ptr", NumGet(PROCESS_INFORMATION, A_PtrSize, "ptr"))
    sleep 1000
}

ShellRunAsUser(filePath, arguments := "", directory := "", verb := "", show := 1)
{
    static VT_UI4 := 0x13, SWC_DESKTOP := 0x8
    ShellWindows := ComObjCreate("Shell.Application").Windows
    Shell := ShellWindows.Item( ComObject(VT_UI4, SWC_DESKTOP) ).Document.Application
    Shell.ShellExecute(filePath, arguments, directory, verb, show)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Отправка оконного сообщения

Не помогло, если запустить от админа, то и скрипт из переменной scriptToRunWithUIAccess запускается от админа, а если запустить без админа, то и скрипт без админа, но ничего не меняется, хоткей не работает.
Это хорошо видно в Notepad++ запущенном даже без админа, хоткей работает только если ахк от админа.

#IF 1
2::
	MsgBox  
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Отправка оконного сообщения

Хм, странно, у меня всё не так. Горячая клавиша в Notepad++ работает даже в скрипте без повышения привилегий. Скрипт, запущенный вышеуказанным способом запускается именно с UIAccess, но не от админа, проверял в Диспетчере задач.
 
 https://i.ibb.co/8ghk8W2m/2025-05-27-22-25-01-1.png
 
Твоя горячая клавиша при активном приложении с повышенными правами почему-то действительно не работает, а вот такая работает:

^1:: MsgBox Hotkey test

 https://i.ibb.co/N6rM3FbG/2025-05-27-22-32-51-3.png

Это на фоне Диспетчера задач. Но у меня Windows 10.

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

17

Re: AHK: Отправка оконного сообщения

teadrinker пишет:

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

Такая тоже работает и без UiAccess.

Если с твоим кодом запустить, то окно поверх диспетчера задач не выводит.
Windows тоже 10.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK: Отправка оконного сообщения

Запускает с админом, ZBID_DESKTOP := 1.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Отправка оконного сообщения

serzh82saratov пишет:

при активном приложении с повышенными правами

Если права одинаковы, то еть и то и другое без админа, то тоже не работает с #IF 1.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20 (изменено: Malcev, 2025-06-03 04:35:32)

Re: AHK: Отправка оконного сообщения

serzh82saratov, тут наверное надо создавать процесс с урезанным токеном.
То есть, после того как мы создали с помощью "SetTokenInformation" hTokenUIAccess, мы должны его урезать:

DllCall("advapi32.dll\CreateRestrictedToken", "ptr", hTokenUIAccess, "uint", LUA_TOKEN := 0x4, "uint", 0, "ptr", 0, "uint", 0, "ptr", 0, "uint", 0, "ptr", 0, "ptr*", hTokenRestricted)

После чего в CreateProcessAsUserW, указать hTokenRestricted.
Пробуй, сам проверить смогу нескоро.