1

Тема: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Есть ли способ придать произвольному окну (напр., notepad) свойство Own к окну панели задач (Taskbar), которая будет иметь свойство "Parent" к notepad?

2

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

А для чего это?

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

3

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Для того, чтоб разместить над таскбаром некое нужное мне информационное окошко, и чтобы оно не западало при кликах по таскбару. Я понимаю, что можно это сделать проверкой по таймеру, будет моргать так или иначе, но, думаю: вдруг есть известное решение без таймера.

4

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Так не сработает:

GWLP_HWNDPARENT := -8

Run, notepad,,, PID
WinWait, ahk_pid %PID%
hwnd_child := WinExist()
; WinSet, AlwaysOnTop

hwnd_owner := WinExist("ahk_class Shell_TrayWnd")

DllCall("SetWindowLongPtr", Ptr, hwnd_child, Int, GWLP_HWNDPARENT, Ptr, hwnd_owner)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Не сработало, блокнот западает (с AlwaysOnTop).

6

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Ну я и говорю, не сработает.

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

7

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Думал, это знак вопроса запал: "Так не сработает?".  А оказалось: "Так не сработает: вот тебе неправильный код"

8

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Почему неправильный? Код абсолютно правильный, если задача была в том, чтобы

k2 пишет:

придать произвольному окну (напр., notepad) свойство Own к окну панели задач (Taskbar), которая будет иметь свойство "Parent" к notepad?

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

9 (изменено: k2, 2015-10-31 06:09:19)

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Я не знаю, но:
1. я надеялся, что у такого окна будет неотъемлемое свойство "поверх parent окна".
2. смотрю в ProcessExplorer св-ва notepad, вижу parent: AutoHotkey.exe
3. может, я вообще путаю с терминами (и неправильно озадачил тему), но имел в виду  выстроить не  процессы (notepad.exe), а именно окна — тогда, например, при перемещении родительского окна будет перемещаться и подчинённое (хотя, не уверен; возможно это дают какие-то доп. стили)

10 (изменено: Alectric, 2015-10-31 12:17:11)

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Вот так как-то:

#singleinstance,force

run,%a_windir%\notepad.exe
sleep,500
hwnd:=WinExist("ahk_class Notepad")

;hwndP:=WinExist("ahk_class Shell_TrayWnd")
;Set_Parent_by_hwnd(hwndP,hwnd)

Set_Parent_by_class("Shell_TrayWnd",hwnd)

WinMove,ahk_id %hwnd%,,800,0
Return

Set_Parent_by_hwnd(hParent,hwnd) ;http://autohotkey.com/board/topic/8142-setparent-function-make-a-gui-belong-to-another-window/
{
  Return DllCall( "SetParent", "ptr", hwnd, "ptr", hParent )
}

Set_Parent_by_class(class,hwnd)
{
  hParent:=DllCall("FindWindowEx","ptr",0,"ptr",0,"str",class,"uint",0,"ptr")
  Return DllCall("SetParent","ptr",hwnd,"ptr",hParent)
}
Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

11 (изменено: k2, 2015-10-31 18:59:38)

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Alectric, спасибо большое, именно это требовалось.
Мои наблюдения: в некоторых случаях целевое окно (похоже, какие-то особые стили) перед запуском скрипта не должно иметь свойство "AlwaysOnTop", и потом не должно хоть на пиксель вылезти за пределы видимого пространства монитора. Если эти условия нарушаются, целевое окно может изчезнуть (возможно, стать скрытым, не проверял).

12 (изменено: Alectric, 2015-10-31 19:20:10)

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

k2 пишет:

целевое окно может изчезнуть

Целевое окно это то, которое нужно поместить внутрь другого или то, в которое нужно поместить другое?

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

13

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

У меня в результате экспериментов в памяти повисли две копии блокнота, видимые только в Диспетчере.

14 (изменено: Alectric, 2015-10-31 21:36:13)

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Дело в том что координаты того окна начинают отсчет от левого верхнего угла теперешнего родительского окна, и если, может другой скрипт, использует winmove, то окно теряется где-то в просторах окна теперешнего родителя. Тоже сначала не понял куда они исчезают, но потом растянул панель задач и они все оказались там.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

15 (изменено: k2, 2015-11-01 02:18:35)

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Прошу извинить: да, целевое окно это то, которое нужно поместить внутрь другого.
Я имел в виду настоящее изчезновение, когда, например в ProcessExplorer - контекст. меню процесса - пункт "window" неактивен. Но блокнот так не ведёт себя, с ним нормально. А если некоторые изчезают, надо последить, чтоб у них не было "поверх всех", и окно хоть краюшком не вылезало за рабочую область экрана. Достаточно, перемещая такое окно мышью, чуть вывести край за границу монитора, и при отпускании мыши окно изчезнет. Я когда-то сталкивался с этим изчезновением, какие-то спецстили были виноваты, сейчас пока не могу найти. Но это ерунда, ничем не мешает.
Потом, у меня, ужас, WinXP. У меня и другие странности с окнами бывают, гораздо более чудные, например.

16 (изменено: Alectric, 2015-11-01 12:00:54)

Re: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")

Доработал функцию для удобства.

#singleinstance,force

run,%a_windir%\notepad.exe
winwait,ahk_class Notepad

hwnd:=WinExist("ahk_class Notepad")
hwndP:=WinExist("ahk_class Shell_TrayWnd")

;SetParent(hwnd,hwndP,"MSTaskListWClass1",600) ; для 7-ки
SetParent(hwnd,hwndP,"ToolbarWindow322",600) ; для XP



SetParent(hwnd,hNewParent,ClassNN="",x=0,y=0)
{
  if ClassNN
    ControlGet,hNewParent,Hwnd,,%ClassNN%,ahk_id %hNewParent%
  oldParent:=DllCall("SetParent","ptr",hwnd,"ptr",hNewParent)
  WinMove,ahk_id %hwnd%,,%x%,%y%
  return oldParent
}
Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.