Autohotkey 中文论坛

完整版: 修改“把窗口钉到桌面上”这段代码
你目前正在浏览的是简化版. 请点击这里浏览完整版
官方论坛找到的代码,作用是把窗口钉到桌面上
代码:
^n::
Gosub PinToDesktop
return

PinToDesktop:

WinGetClass, class, A
    
IfWinActive, ahk_class %class%
    SysGet, MonitorWorkArea, MonitorWorkArea,1

    WinGet, DID, ID, ahk_class Progman
    WinGet, CID, ID, ahk_class %class%
    DllCall("SetParent", "uint", CID, "uint", DID)

return
要将其改成命令行工具,用法大概是
代码:
p.exe <class|title>
默认是”钉“,加上 /u 参数就是取消”钉“;如果可以用 title 的话,能否支持通配符?
WinGet 系列中的 WinTitle 参数可以使用正则表达式, 参考 SetTitleMatchMode .
还有一个方法,可以把 你需要的窗口加入到一个 Group 里面,调用的时候就用 Ahk_group GroupName 就行了!
就要命令行...help...
下面有说如何对命令行参数的操作.
http://ahkbbs.cn/Help/docs/Scripts.htm#cmd
劳驾下各位给出完整的代码。我很菜的...
只用加一句 SetTitleMatchMode RegEx 自己看下帮助吧!
他是不是想说将这个脚本编译成EXE后,想自定义那个 /u 的开关给这个EXE?
是的
在第一句加 SetTitleMatchMode RegEx
把 IfWinActive, ahk_class %class% 改成 IfWinActive, ahk_class %2%
至于怎么匹配 你还要去看看帮助: RegExMatch()
楼主你贴的代码在我的机子上没有“把窗口钉到桌面上”的效果啊,倒是把它们“从任务栏中隐藏了”(桌面可看到),奇怪:o ?楼主你那有“把窗口钉到桌面上”的效果吗?“把窗口钉到桌面上”的效果是什么样的?晕:L
呵呵,楼主你的问题okey3m兄说得很清楚了啊
p.exe  参数1 参数2 。。。  参数1 参数2对应于脚本中的%1%  %2% ... 参数间用空格隔开,若参数含空格用引号框起,再用StringReplace, 1, 1, ",, All在脚本中去除
WinGet 的 WinTitle 参数支持正则表达式,那如BLoom2说的只要在脚本开头处加上SetTitleMatchMode RegEx ,用WinGet, id, List, 可得到所有满足条件的窗口的id
因为脚本在我机子上反应奇怪,所以就不贴代码了
引用:原帖由 rdingding 于 2008-9-20 14:45 发表 [Image: back.gif]
楼主你贴的代码在我的机子上没有“把窗口钉到桌面上”的效果啊,倒是把它们“从任务栏中隐藏了”(桌面可看到),奇怪:o ?
...
.就是你看到那个效果啊..
从任务栏里消失了..像钉子一样钉到桌面上了(穿透了N个窗口,穿透术)...

我感觉本来就是这个意思.你表示的是什么意思?我木有理解
任务栏上消失我理解是.钉到了任务栏了背面.~~~


[ 本帖最后由 wgf4242 于 2008-9-20 15:47 编辑 ]
我记得groups上说过次用参数的啊,用那个改改就行了~

哪个是取消呢
引用:哪个是取消呢
所以就问你们啊...我在官方论坛里问了,结果一个人很快就回复了,叫我搜索 setparent,果然找到了代码,我再问就没人答了...
引用:原帖由 wgf4242 于 2008-9-20 15:43 发表 [Image: back.gif]

.就是你看到那个效果啊..
从任务栏里消失了..像钉子一样钉到桌面上了(穿透了N个窗口,穿透术)...

我感觉本来就是这个意思.你表示的是什么意思?我木有理解
任务栏上消失我理解是.钉到了任务栏 ...

呵呵,我被最小化按键一按窗口就消失的现象给弄晕了,:loveliness:
简单试验用的代码,参考一下吧,不会恢复,什么子窗口父窗口弄不清啦:'( ,要请教会编程的高手们,怎样用Dllcall得到指定窗口的父窗口?又或者不指定父窗口为Progman就会恢复了??

SetTitleMatchMode RegEx
if 0 = 0
{
msgbox, 使用说明:`n`n`n p.exe [/u] [title1] [title2]... `n`n 当title含空格时须用引号框起`n`n title支持正则表达式
return
}


Loop, %0%
{
StringReplace, param, %A_Index%, ",, All
if (param = "/u")
{
msgbox, 这里填入恢复代码
}
WinGet, id, list, %param%
Loop, %id%
{
var = % id%a_index%
WinGetTitle, OutputVar , ahk_id %var%
IfWinActive, %OutputVar%
SysGet, MonitorWorkArea, MonitorWorkArea,1
WinGet, DID, ID, ahk_class Progman
WinGet, CID, ID, %OutputVar%
DllCall("SetParent", "uint", CID, "uint", DID)
}
}
return
多谢,能用。

到官方论坛逛逛看如何恢复啊..
DllCall("SetParent", "uint", ChildHwnd, "uint", 0)
只用把父窗体的句柄赋值为 0 就可以了!
噢~~,原来这样就行了:P 会编程就是厉害啊;P
学习了!!
参考网址