这段代码实现了一个非常有趣的功能:将两个记事本(Notepad)窗口嵌入到创建的 GUI 窗体中,并控制它们的大小和位置。
示例1:
#SingleInstance, force hwndls := [] loop 2 { Run, notepad, , , pid WinWait, ahk_pid %pid% WinGet, id, id, ahk_pid %pid% hwndls.push(id + 0) } Gui, +hwndparentHwnd Gui, show, w500 h500, AHK窗体 for _,childHwnd in hwndls { ; SetParent 将窗体嵌入 ahk 的 Gui SetParent(childHwnd, parentHwnd) ; 用 winmove 调整被嵌入窗体的位置和尺寸 WinMove, ahk_id %childHwnd%, , % (A_Index - 1) * 300, 0, 300, 200 ; 可能有必要重绘窗体, 避免显示不正常 WinSet, Redraw, , % "ahk_id " format("0x{:x}", parentHwnd) } return GuiClose: ExitApp Return /* https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setparent HWND SetParent( [in] HWND hWndChild, [in, optional] HWND hWndNewParent ); */ SetParent(childHwnd, parentHwnd) { DllCall("User32.dll\SetParent", "ptr", childHwnd,"ptr", parentHwnd, "UInt") }
示例2:
#NoEnv #SingleInstance Force SetBatchLines, -1 Process, Priority,, High SendMode Input SetWorkingDir %A_ScriptDir% ;OnMessage(0x6, "WM_ACTIVATE") Global HGui99 Gui, 99: +HwndHGui99 Gui, 99: Show, w400 h200, 父窗口 Gui, 1: +HwndHGui1 +E0x00010000 -Caption Gui, 1:Add, Button,x0 y0 w72 h28, OK DllCall("SetParent", "ptr", HGui1, "ptr", HGui99) Gui, 1: Show, x0 y0 w72 h28, 子窗口 #1 Gui, 2: +HwndHGui2 +E0x00010000 -Caption Gui, 2:Add, text,w60 h20, 停 止 : DllCall("SetParent", "ptr", HGui2, "ptr", HGui99) Gui, 2: Show, x215 y5 w200 h200, 子窗口 #2 ;Gui, 99: Show, w800 h600, 父窗口 ;msgbox % HGui99 Return GuiEscape: GuiClose: ExitApp Return ;WM_ACTIVATE(wParam, lParam) { ; Static init:=OnMessage(0x6, "WM_ACTIVATE") ; Tooltip % wParam ;} ; ;; 作用域为Gui生成框体内,移动鼠标触发 ;WM_SETCURSOR() { ; Static init:=OnMessage(0x20, "WM_SETCURSOR") ; Tooltip 如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口 ;} ; ;; 作用域为Gui生成框体按下鼠标左键触发 ;WM_LBUTTONDOWN() { ; Static init:=OnMessage(0x201, "WM_LBUTTONDOWN") ; Tooltip 按下鼠标左键 ;} ; 如果点击,exstyle允许父母拍摄焦点。 ; +E0x00010000 会影响父窗口关闭按钮
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)