新人问题,帮我改进下这个功能(连按数字实现win+数字),谢谢~

遇到了问题?请先进行搜索(中文和英文),然后在此提问

Moderators: tmplinshi, arcticir

wocala
Posts: 5
Joined: 20 Mar 2015, 02:41

新人问题,帮我改进下这个功能(连按数字实现win+数字),谢谢~

20 Mar 2015, 02:45

接触autohotkey一段时间了,很不错的软件,自己摸索的时候有几个功能无法实现,希望大家帮帮忙。
1.快速(时间可调最好)连按两次同一数字键(如11),可以实现win+数字(切换到特定程序,无视输入框)
2.在chrome inactive(未激活)时,ctrl+t 发送到 win+1 以及 ctrl+t(非chrome页面按ctrl+t直接打开chrome新标签页)。chrome激活时还是指向ctrl+t。


第一个完全不知道如何下手,第二个尝试了下,但不行,如下。


原有脚本:
!Esc::Send !{F4}


;Vim Key Binding
#if ( A_Cursor = "IBeam" or A_CaretX >= 100 )
{
^o::send {down}
^u::send {left}

^i::send {up}

^p::send {right}

}
#ifwinactive ahk_class Chrome_WidgetWin_1
{
^m::send ^w ;关闭当前标签页
return
^.::send ^{tab} ;切换到下一个标签页
return
^,::send ^+{tab} ;切换到上一个标签页
^/::send ^+t ;打开刚刚关闭的标签页
F1::send ^t ;新标签页
!Esc::Send #d
}




第二个功能我写的:
#IfWinNotActive Chrome
{
^t::send #1 ^t
}
缺点:chorme非激活时可以实现,但chrome激活时会最小化chrome。


#IfWinNotActive ahk_class Chrome_WidgetWin_1
{
^t::send #1 ^t
}
缺点:(激活,非激活均可实现)但以下功能失效。
;Vim Key Binding
#if ( A_Cursor = "IBeam" or A_CaretX >= 100 )
{
^o::send {down}
^u::send {left}

^i::send {up}

^p::send {right}

}
非常感谢!
tmplinshi
Posts: 1604
Joined: 01 Oct 2013, 14:57

Re: 新人问题,帮我改进下这个功能(连按数字实现win+数字),谢谢~

20 Mar 2015, 04:45

双击示例:

Code: Select all

~1::
	; 如果现在这个按键等于上一个按键,并且两次按键间隔小于 300 毫秒
	If (A_ThisHotKey = A_PriorHotKey) && (A_TimeSincePriorHotkey < 300)
		Send, #1
Return

~Control & ~LButton::
	If (A_ThisHotKey = A_PriorHotKey) && (A_TimeSincePriorHotkey < 300) && GetKeyState("Control", "P")
		MsgBox, 你按住了 Ctrl,且双击鼠标左键
Return

; 可以写成函数方便调用

$^v:: ; 前缀“$”是为了避免快捷键发送快捷键本身,造成死循环。
	If IsDoubleClick() ; 参数为空则使用默认值 300。如果要用其他时间,比如 500 毫秒则用 IsDoubleClick(500)
		MsgBox, 你按了两次 Ctrl+V
	Else
		Send, ^v
Return

IsDoubleClick(MSec = 300) {
	Return (A_ThisHotKey = A_PriorHotKey) && (A_TimeSincePriorHotkey < MSec)
}
第二点理解没太明白。你意思是 Chrome 未激活时,按 Ctrl+t 就激活它,并发送 Ctrl+t,也发送另外一个快捷键 Win+1 吗?试试这个:

Code: Select all

#IfWinNotActive, ahk_class Chrome_WidgetWin_1
	$^t:: ; 前缀“$”是为了避免快捷键发送快捷键本身,造成死循环。
		If WinExist("ahk_class Chrome_WidgetWin_1") {
			WinActivate
			WinWaitActive
			Send, ^t
		}

		Send, #1
	Return
#If ; 如果下面还有快捷键,并且是全局的,那么需要用“#If”或者“#IfWinActive”、"#IfWinNotActive" 来恢复全局
wocala
Posts: 5
Joined: 20 Mar 2015, 02:41

Re: 新人问题,帮我改进下这个功能(连按数字实现win+数字),谢谢~

20 Mar 2015, 07:35

非常感谢!
试了一下,第二个功能实现地很好, :thumbup:
第一个可以实现,但是不能无视输入框,不知道autohotkey里有没有这样的函数可以实现?
再次感谢~~~~~
:clap: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup:
tmplinshi wrote:双击示例:

Code: Select all

~1::
	; 如果现在这个按键等于上一个按键,并且两次按键间隔小于 300 毫秒
	If (A_ThisHotKey = A_PriorHotKey) && (A_TimeSincePriorHotkey < 300)
		Send, #1
Return

~Control & ~LButton::
	If (A_ThisHotKey = A_PriorHotKey) && (A_TimeSincePriorHotkey < 300) && GetKeyState("Control", "P")
		MsgBox, 你按住了 Ctrl,且双击鼠标左键
Return

; 可以写成函数方便调用

$^v:: ; 前缀“$”是为了避免快捷键发送快捷键本身,造成死循环。
	If IsDoubleClick() ; 参数为空则使用默认值 300。如果要用其他时间,比如 500 毫秒则用 IsDoubleClick(500)
		MsgBox, 你按了两次 Ctrl+V
	Else
		Send, ^v
Return

IsDoubleClick(MSec = 300) {
	Return (A_ThisHotKey = A_PriorHotKey) && (A_TimeSincePriorHotkey < MSec)
}
第二点理解没太明白。你意思是 Chrome 未激活时,按 Ctrl+t 就激活它,并发送 Ctrl+t,也发送另外一个快捷键 Win+1 吗?试试这个:

Code: Select all

#IfWinNotActive, ahk_class Chrome_WidgetWin_1
	$^t:: ; 前缀“$”是为了避免快捷键发送快捷键本身,造成死循环。
		If WinExist("ahk_class Chrome_WidgetWin_1") {
			WinActivate
			WinWaitActive
			Send, ^t
		}

		Send, #1
	Return
#If ; 如果下面还有快捷键,并且是全局的,那么需要用“#If”或者“#IfWinActive”、"#IfWinNotActive" 来恢复全局
tmplinshi
Posts: 1604
Joined: 01 Oct 2013, 14:57

Re: 新人问题,帮我改进下这个功能(连按数字实现win+数字),谢谢~

20 Mar 2015, 08:10

你的意思是不输入快捷键对应的字符吗?直接写

Code: Select all

1::
    代码
Return
只不过这样一来,你就没法再输入 1 了。
wocala
Posts: 5
Joined: 20 Mar 2015, 02:41

Re: 新人问题,帮我改进下这个功能(连按数字实现win+数字),谢谢~

20 Mar 2015, 08:46

我的意思是如果连按的话无视输入框,如果非连按的话还是正常输入。
不过这个功能我用7+ taskbar tweaker代替了, 实现的不错。
非常感谢你~
tmplinshi wrote:你的意思是不输入快捷键对应的字符吗?直接写

Code: Select all

1::
    代码
Return
只不过这样一来,你就没法再输入 1 了。
tmplinshi
Posts: 1604
Joined: 01 Oct 2013, 14:57

Re: 新人问题,帮我改进下这个功能(连按数字实现win+数字),谢谢~

20 Mar 2015, 09:26

Code: Select all

$1::
	If ( MSec := IsDoubleClick() )
		ToolTip, 检测到快速双击! 双击速度: %MSec% 毫秒
	Else
		ToolTip
Return

IsDoubleClick(MSec = 200) {
	static _count := 0, k
	static fn := Func("IsDoubleClick").Bind("SendKey")

	If (MSec = "SendKey") {
		_count := 0
		k := LTrim(A_ThisHotkey, "$")
		k := GetKeyState("CapsLock", "T") ? Format("{:U}", k) : k
		SendInput, % "{" k "}"
	}
	Else If (++_count <= 1) {
		SetTimer, %fn%, % -1 * MSec
		Return
	} Else {
		SetTimer, %fn%, Off
		_count := 0
		If (A_TimeSincePriorHotkey < MSec)
			Return A_TimeSincePriorHotkey
	}
}
我被绕晕了。。

测试了下,效果并不好,会影响短按,而且这也是必然的吧。因为你要“无视输入框”,那么必然要在双击耗时范围内屏蔽按键(200毫秒左右),然后才能进行单击、双击判断。而不屏蔽按键,就没法达到“无视输入框”。
wocala
Posts: 5
Joined: 20 Mar 2015, 02:41

Re: 新人问题,帮我改进下这个功能(连按数字实现win+数字),谢谢~

20 Mar 2015, 20:24

的确复杂, :crazy:
我用autohotkey主要是改一下快捷键什么的,所以也不打算深入研究了……
谢谢你的帮助~ :thumbup:
tmplinshi wrote:

Code: Select all

$1::
	If ( MSec := IsDoubleClick() )
		ToolTip, 检测到快速双击! 双击速度: %MSec% 毫秒
	Else
		ToolTip
Return

IsDoubleClick(MSec = 200) {
	static _count := 0, k
	static fn := Func("IsDoubleClick").Bind("SendKey")

	If (MSec = "SendKey") {
		_count := 0
		k := LTrim(A_ThisHotkey, "$")
		k := GetKeyState("CapsLock", "T") ? Format("{:U}", k) : k
		SendInput, % "{" k "}"
	}
	Else If (++_count <= 1) {
		SetTimer, %fn%, % -1 * MSec
		Return
	} Else {
		SetTimer, %fn%, Off
		_count := 0
		If (A_TimeSincePriorHotkey < MSec)
			Return A_TimeSincePriorHotkey
	}
}
我被绕晕了。。

测试了下,效果并不好,会影响短按,而且这也是必然的吧。因为你要“无视输入框”,那么必然要在双击耗时范围内屏蔽按键(200毫秒左右),然后才能进行单击、双击判断。而不屏蔽按键,就没法达到“无视输入框”。
vkprime
Posts: 1
Joined: 30 Sep 2018, 04:38

Re: 新人问题,帮我改进下这个功能(连按数字实现win+数字),谢谢~

30 Sep 2018, 04:42

"我用7+ taskbar tweaker代替了" 你好 麻烦请教下是如何用7+ taskbar tweaker实现的呢 ,好像没这个功能

Return to “请求帮助”

Who is online

Users browsing this forum: No registered users and 18 guests