Тема: AHK: Сделать произвольное окно "Own" к панели задач ("Parent")
Есть ли способ придать произвольному окну (напр., notepad) свойство Own к окну панели задач (Taskbar), которая будет иметь свойство "Parent" к notepad?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть ли способ придать произвольному окну (напр., notepad) свойство Own к окну панели задач (Taskbar), которая будет иметь свойство "Parent" к notepad?
А для чего это?
Для того, чтоб разместить над таскбаром некое нужное мне информационное окошко, и чтобы оно не западало при кликах по таскбару. Я понимаю, что можно это сделать проверкой по таймеру, будет моргать так или иначе, но, думаю: вдруг есть известное решение без таймера.
Так не сработает:
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)Не сработало, блокнот западает (с AlwaysOnTop).
Ну я и говорю, не сработает. ![]()
Думал, это знак вопроса запал: "Так не сработает?". А оказалось: "Так не сработает: вот тебе неправильный код" ![]()
Почему неправильный? Код абсолютно правильный, если задача была в том, чтобы
придать произвольному окну (напр., notepad) свойство Own к окну панели задач (Taskbar), которая будет иметь свойство "Parent" к notepad?
Я не знаю, но:
1. я надеялся, что у такого окна будет неотъемлемое свойство "поверх parent окна".
2. смотрю в ProcessExplorer св-ва notepad, вижу parent: AutoHotkey.exe
3. может, я вообще путаю с терминами (и неправильно озадачил тему), но имел в виду выстроить не процессы (notepad.exe), а именно окна — тогда, например, при перемещении родительского окна будет перемещаться и подчинённое (хотя, не уверен; возможно это дают какие-то доп. стили)
Вот так как-то:
#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)
}
Alectric, спасибо большое, именно это требовалось.
Мои наблюдения: в некоторых случаях целевое окно (похоже, какие-то особые стили) перед запуском скрипта не должно иметь свойство "AlwaysOnTop", и потом не должно хоть на пиксель вылезти за пределы видимого пространства монитора. Если эти условия нарушаются, целевое окно может изчезнуть (возможно, стать скрытым, не проверял).
целевое окно может изчезнуть
Целевое окно это то, которое нужно поместить внутрь другого или то, в которое нужно поместить другое?
У меня в результате экспериментов в памяти повисли две копии блокнота, видимые только в Диспетчере.
Дело в том что координаты того окна начинают отсчет от левого верхнего угла теперешнего родительского окна, и если, может другой скрипт, использует winmove, то окно теряется где-то в просторах окна теперешнего родителя. Тоже сначала не понял куда они исчезают, но потом растянул панель задач и они все оказались там.
Прошу извинить: да, целевое окно это то, которое нужно поместить внутрь другого.
Я имел в виду настоящее изчезновение, когда, например в ProcessExplorer - контекст. меню процесса - пункт "window" неактивен. Но блокнот так не ведёт себя, с ним нормально. А если некоторые изчезают, надо последить, чтоб у них не было "поверх всех", и окно хоть краюшком не вылезало за рабочую область экрана. Достаточно, перемещая такое окно мышью, чуть вывести край за границу монитора, и при отпускании мыши окно изчезнет. Я когда-то сталкивался с этим изчезновением, какие-то спецстили были виноваты, сейчас пока не могу найти. Но это ерунда, ничем не мешает.
Потом, у меня, ужас, WinXP. У меня и другие странности с окнами бывают, гораздо более чудные, например.
Доработал функцию для удобства.
#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
}
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться