发表回复 
【已解决】怎样能令输入文本的情况下脚本内某些热键暂时失效?
2012-09-30, 04 : 58
 
[i=s] 本帖最后由 jony.tw 于 2012-9-30 09:34 编辑 [/i]

#40 roy2012
因為你的程式行裡一直有 suspend on 與 Suppend off
且因 settimer 造成嚴重的干擾 (Douoble Click, 熱字串都會完全失效的)

昨天稍早貼出這篇時就差你加入的toolTip顯示部份未加
但是下方的#IF根本沒有作動...所以稍早可以判讀焦點是否在Edit控件的部份仍未奏效...
只因小女週六要上機學習...不得不讓出來...以致貼出未測試完全的錯誤碼..

你如果仔細去探究了!其實貼文前,註解還是先在Scite裡打好!因語法加亮可以看到問題
執行前檢查也會排除問題....不會貼出還要修正的碼

稍後,我當然是陷入為何catch()副程式失效的問題裡....試了很久!
如何可以免除滑鼠快鍵狀態的干擾...最後只好捨掉副程式..直接加在快鍵裡
(重覆的程式碼會使快鍵定義變得很臭很長)把Suspend通通抓掉....

也修正了#39的程式碼

#41
引用:

这里的OKK代表 什么? 查不到。。。


OKK只是一個變數...在快鍵a的例子中有檢查此狀態 or (OKK = 0)
無須去停用快鍵...而是讓不同的快鍵去判斷狀態...這會靈活些

因為整段碼都在按鈕那一瞬間執行...小心別寫得太複雜!
多用掉幾個 ms 打字快 主機慢的朋友一定會發現嚴重干擾

;為了縮減定義快鍵的程式碼...改寫如下...
代码: (全选)
#Persistent
Edit_Mode := 0
; 注意前面的$不可捨掉
$a::
if  not_Edit_InFocus() {
run www.google.com
}else{
        sendinput % RegExReplace(A_ThisHotkey, "\$", "")   ;就是送出去了$的鍵定義 只適用字母單鍵定義...
}return

~LButton::
If  (A_Cursor = "IBeam" ) {
        Edit_Mode := 1

; } else if(A_Cursor = "Arrow" ) {
} else {
   Edit_Mode := 0
} return

not_Edit_InFocus(){
Global Edit_Mode
ControlGetFocus theFocus, A ; 取得目前活動窗口 的焦點之控件标识符
return  !(inStr(theFocus , "Edit") or  (theFocus = "Scintilla1")
or (theFocus ="DirectUIHWND1") or  (Edit_Mode = 1))
}

或者不阻斷原來的單鍵回應...改這樣寫...你會更清楚你改掉了什麼??


~a::
if not_Edit_InFocus() {
run www.google.com
}return

但這樣做熱字串就可以使用了
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-30, 09 : 58
 
[i=s] 本帖最后由 roy2012 于 2012-9-30 10:17 编辑 [/i]

引用:#40 roy2012
因為你的程式行裡一直有 suspend on 與 Suppend off
且因 settimer 造成嚴重的干擾 (Douoble Click, 熱字串都會完全失效的)

昨天稍早貼出這篇時就差你加入的toolTip顯示部份未加
但是下方的#IF根 ...
jony.tw 发表于 2012-9-30 04:58 [Image: back.gif]
明白了,OKK是一个自定义的开关,以后我也懂得适当利用这种开关了。
昨晚,我测试了你最近发表 基于 焦点 的scrip,效果理想,无色无形但有效,赞!

(以下 纯学术讨论,不是重点)
关于 获取 Caret 的信息,我有个好奇:系统里,什么元素 控制 光标的闪烁频率 的呢?
如果 按下 键盘 的时候,检查 这个【控制光标的闪烁频率】的元素是否在运作,
能否证明屏幕上是否有光标在闪动呢?
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-30, 12 : 44
 
光标的闪烁频率 只是個常數 修改或取得都與目前想要的目的完全無關...也離題了
代码: (全选)
Norm := DllCall("GetCaretBlinkTime")
OnExit, Exitt

F1::DllCall("SetCaretBlinkTime", UInt, 200)  ; Fast
F2::DllCall("SetCaretBlinkTime", UInt, Norm) ; Normal / Default
F3::DllCall("SetCaretBlinkTime", UInt, 900)  ; Slow

Exitt:
DllCall("SetCaretBlinkTime", UInt, Norm)
ExitApp
Return
证明屏幕上是否有光标在闪动....這個可能連常數都抓不到
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-10-02, 10 : 03
 
[i=s] 本帖最后由 jony.tw 于 2012-10-3 16:51 编辑 [/i]

再次感恩nepter大

原來就如您之前提到寫法,省下一大串重覆又黏..麵條...$也可完全略掉了

附提:剛好catch是個的識別字...在用TRY除錯時用的...難怪試了半天AHK都是錯亂的
代码: (全选)
#Persistent
;全域有效的熱鍵、熱字串要定義在...程式開頭的執行段裡...
::ahk::autohotkey

~LButton::
If  (A_Cursor = "IBeam" ) {
        Edit_Mode := 1
} else if(A_Cursor = "Arrow" ) {
   Edit_Mode := 0
} return

return

#if  1 = not_Edit_InFocus()
{
a:: run http://www.google.com
b:: run http://www.autohotkey.com/community/
c:: run http://www.yahoo.com
;只需定義非編輯狀態時的熱鍵群..

}

#if  0 = not_Edit_InFocus()
{
^+a:: run http://www.google.com
^+b:: run http://www.autohotkey.com/community/
^+c:: run http://www.yahoo.com
;只定義編輯狀態時的熱鍵群..


}



not_Edit_InFocus(){
Global Edit_Mode
ControlGetFocus theFocus, A ; 取得目前活動窗口 的焦點之控件标识符
return  !(inStr(theFocus , "Edit") or  (theFocus = "Scintilla1")   ;把查到是文字編輯卻不含Edit名的theFucus加進來
or (theFocus ="DirectUIHWND1") or  (Edit_Mode = 1))
}
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-10-02, 20 : 41
 
引用:再次感恩nepter大

原來就如您之前提到寫法,省下一大串重覆又黏..麵條...$也可完全略掉了

附提:剛好catch是個的識別字...在用TRY除錯時用的...難怪試了半天AHK都是錯亂的#PersistentEdit_Mode = 0
;全域有效 ...
jony.tw 发表于 2012-10-2 10:03 [Image: back.gif]
太好了,现在变得越强大越简洁。
有了这个script帮助,我现在看着键盘完全不一样感觉,
以往我觉得那是一个打字工具,很不顺眼,现在觉得键盘是一把瑞士组合军刀。
指针绝大多数时间都只在屏幕中心活动就能完成所需步骤。

再次感谢各位热心发表意见。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-10-20, 17 : 00
 
[i=s] 本帖最后由 txd1d 于 2012-10-20 17:01 编辑 [/i]

45# jony.tw
单独运行了你45楼的这段代码,出现错误提示

Error at line 14.

Line Text: #if 1 = not_Edit_InFocus()
Error: This line does not contain a recognized action.

The program will exit.
---------------------------
确定
---------------------------

请问该怎么解决????
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-10-20, 17 : 15
 
47# txd1d
我試過並沒有收到類似警告....應該是版本的差異,因為#if 是 Autohotkey_L 後才有的東西

我用的是AutoHotkey_L 1.1.0.8版(在win7平台)
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-10-20, 21 : 13
 
已更新软件,果然成功,感谢!!!
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-10-20, 22 : 49
 
[i=s] 本帖最后由 txd1d 于 2012-10-20 22:55 编辑 [/i]

发现一个小问题,在多标签浏览器中,将光标放入网页中的一个文本框中,然后切换标签,再切换回来,这个时候虽然还是在文本框中,但是快捷键处于有效的状态。

目前只发现在切换标签时才会出现这个问题,而且必须是在网页中的文本框。如果是切换程序,或者是标题栏、搜索栏等的文本框,则不会出现。在360极速浏览器、IE8中均是​如此,其他浏览器未测试
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-10-20, 23 : 15
 
刚才居然发现在word、excel刚打开时快捷键依然有效啊…………………………
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-10-23, 23 : 03
 
[i=s] 本帖最后由 jony.tw 于 2012-10-25 21:34 编辑 [/i]

沒錯....又沒探過word, excel的使用框有沒有edit控件痕跡....
用IBeam點選文字框的滑鼠探法是很含糊的..是非不得已的變通...沒點選..就認定是非編輯狀態

但如果明白的知道焦點編輯文框的控件名(含Edit字眼的是Win的標準控件...我有寫到了..
inStr(theFocus , "Edit") 直接認定是編輯狀態...不用上述作IBeam方法做判斷
另一個是Scite編輯器...(theFocus = "Scintilla1")

;把查到是文字編輯卻不含Edit名的theFucus加進來....您必須用WinSpy查你的文字編輯器的文框控件...並且把它加進來
===================================================
另外一個可能是你剛開Word , Excel時 焦點並不在編輯控件上...

你最好看完整個討論串...明白來龍去脈...
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2014-07-13, 12 : 17 (这个帖子最后修改于: 2014-07-13 13 : 42 by robertL.)
RE: 【已解决】怎样能令输入文本的情况下脚本内某些热键暂时失效?
信息量大,
大伙边看边总结啊,难道都没记笔记的习惯..

参见:小示例:自动屏蔽热键,当鼠标处于位置/控件具有焦点时

One for all, but man for himself

帮推广:AHK知乎专栏
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合