这段代码实现了一个非常有趣的功能:将两个记事本(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)