1

Тема: AHK: Запрет активации окна

Есть какой-то способ запретить активацию, а если окно свёрнуто то и показ окна, например при применении к нему команды WinActivate? И чтобы окно продолжало "работать" принимать сообщения и.т.п.


If !(hWnd := WinExist("ahk_class Notepad"))
{
    Run, Notepad,,, PID
    WinWait, ahk_pid %PID%
    hWnd := WinExist()
} 
ControlSetText Edit1
WinMinimize
 ; Что-то применяем
Return

1::
    WinActivate, ahk_id %hWnd%
    ControlSetText Edit1, Записали текст`, но не активировали, ahk_id %hWnd%
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Запрет активации окна

Не думаю, что в рамках AHK это возможно (перехват сообщений и winapi-функций). А зачем такое могло понадобиться? Записать текст в контрол можно и не активируя окно.

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

3

Re: AHK: Запрет активации окна

Ну например в соседней теме вызывается нужный встроенный метод приложения, выполняющий некоторые действия в его окне, но также выводящий его на передний план:

oSkype.Client.OpenContactsTab()

а активация-показ окна при этом не требуется пользователю.

Записать текст в контрол можно и не активируя окно.

Ну это я знаю, просто для проверки, если будет вариант решения вопроса.

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

4 (изменено: serzh82saratov, 2015-08-22 16:27:15)

Re: AHK: Запрет активации окна

Не думаю, что в рамках AHK это возможно (перехват сообщений и winapi-функций)

А ты не пробовал в SetWindowsHookEx idHook установить в WH_CALLWNDPROC, а для dwThreadId установить ThreadId нужного процесса? Я бы сам попробовал, но не могу получить ThreadId стороннего процесса. Или там ещё какие то заморочки с hMod?

HHOOK WINAPI SetWindowsHookEx(
  _In_ int       idHook,
  _In_ HOOKPROC  lpfn,
  _In_ HINSTANCE hMod,
  _In_ DWORD     dwThreadId
);


CallWndProcHook := DllCall("SetWindowsHookEx"
    ,"int", 0x4  ; WH_CALLWNDPROC
    ,"Ptr", RegisterCallback("CallWndProc")
    ,"Ptr", 0
    ,"UInt", ThreadId, "Ptr")
     
CallWndProc(nCode, wParam, lParam) {
    global CallWndProcHook 
    Critical
    msg := NumGet(lParam+8)
    hwnd := NumGet(lParam+12)
    
    ToolTip % msg "`n" hwnd   
    Return DllCall("CallNextHookEx","Ptr",CallWndProcHook,"Int",nCode,"UInt",wParam,"UInt",lParam)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Запрет активации окна

Чтобы установить хуки, кроме WH_KEYBOARD_LL и WH_MOUSE_LL, их функция должна находиться в отдельном модуле (в dll), всё уже давно опробовано на офф. форуме. Я тоже в своё время по-всякому пробовал.

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

6

Re: AHK: Запрет активации окна

Чтобы установить хуки, кроме WH_KEYBOARD_LL и WH_MOUSE_LL

Думаю что не только, видел какие то примеры с WH_JOURNALPLAYBACK... WH_CALLWNDPROC тоже работает для ThreadId  своего процесса.

Windows Store app development If dwThreadId is zero, then window hook DLLs are not loaded in-process for the Windows Store app processes and the Windows Runtime broker process unless they are installed by either UIAccess processes (accessibility tools). The notification is delivered on the installer's thread for these hooks:
WH_JOURNALPLAYBACK
WH_JOURNALRECORD
WH_KEYBOARD
WH_KEYBOARD_LL
WH_MOUSE
WH_MOUSE_LL

всё уже давно опробовано на офф. форуме.

Думаю это не гарантия невозможности.

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

7

Re: AHK: Запрет активации окна

WH_CALLWNDPROC для своего процесса — это, как я понимаю, то же, что OnMessage(), так что смысла в таком хуке немного.
Нужный тебе ThreadId — это идентификатор ветки, создавшей окно. Получить можно так:

Run, notepad,,, PID
WinWait, ahk_pid %PID%
MsgBox, % ThreadId := DllCall("GetWindowThreadProcessId", Ptr, WinExist(), Ptr, 0)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Запрет активации окна

Ясно. А идей как окно "заморозить на время от активации" нет? Может какая то оконная функция.

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

9

Re: AHK: Запрет активации окна

Применить стиль WS_EX_NOACTIVATE?

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

10

Re: AHK: Запрет активации окна

Нет, не сработает, пробовал.

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

11

Re: AHK: Запрет активации окна

Других идей нету.

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

12

Re: AHK: Запрет активации окна

В ShowWindow есть некий параметр SW_SHOWDEFAULT мне не понятный, там ещё в примечаниях что то связано с ним и STARTUPINFO structure, возможно ещё с WinMain (тоже загадочная функция).

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

13

Re: AHK: Запрет активации окна

SW_SHOWDEFAULT — это тот вид окна, который указан в STARTUPINFO при создании процесса. Некоторые окна появляются свёрнутыми, некоторые — скрытыми. Например, для блокнота этот параметр равен SW_SHOW (обычный вид окна). Но тебе это никак не поможет, потому что процесс не ты создаёшь, а скомпилированный исполняемый файл приложения. С WinMain не разбирался.

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

14

Re: AHK: Запрет активации окна

teadrinker пишет:

процесс не ты создаёшь, а скомпилированный исполняемый файл приложения

Не, не прав. Если приложение запускается кликом по исполняемому файлу, процесс создаёт система от имени пользователя с установками по умолчанию, если запускать скриптом — можно выставить свои установки:

CreateProcess("notepad", SW_MINIMIZE := 6)

CreateProcess(CommandLine, ShowWindow = 0, flag = 0)  {
   static STARTF_USESHOWWINDOW := 1
   
   VarSetCapacity(STARTUPINFO, size := 4*A_PtrSize + 8*4 + 5*A_PtrSize, 0)
   NumPut(size, STARTUPINFO)
   
   (ShowWindow && NumPut(STARTF_USESHOWWINDOW, &STARTUPINFO + 4*A_PtrSize + 7*4))
   NumPut(ShowWindow, &STARTUPINFO + 4*A_PtrSize + 8*4)
   
   VarSetCapacity(PROCESS_INFORMATION, 2*A_PtrSize + 8, 0)
   
   DllCall("CreateProcess", Ptr, 0, Str, CommandLine
                          , Ptr, 0, Ptr, 0
                          , Int, bInheritHandles := 0, UInt, flag, Ptr, 0, Ptr, 0
                          , Ptr, &STARTUPINFO, Ptr, &PROCESS_INFORMATION)
                          
   DllCall("CloseHandle", Ptr, hThread := NumGet(PROCESS_INFORMATION))
   DllCall("CloseHandle", Ptr, hProcess := NumGet(&PROCESS_INFORMATION + A_PtrSize))
   Return PID := NumGet(&PROCESS_INFORMATION + 2*A_PtrSize, "UInt")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Запрет активации окна

Но это то же самое, что

Run, notepad,, Min

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

16

Re: AHK: Запрет активации окна

teadrinker Спасибо за разъяснения.

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

17

Re: AHK: Запрет активации окна

А тут читал?
https://social.msdn.microsoft.com/Forum … arpgeneral

18

Re: AHK: Запрет активации окна

Это о своём приложении.

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