发表回复 
【已解决】怎样能令输入文本的情况下脚本内某些热键暂时失效?
2012-09-22, 17 : 31
【已解决】怎样能令输入文本的情况下脚本内某些热键暂时失效?
[i=s] 本帖最后由 roy2012 于 2012-10-2 20:42 编辑 [/i]

我的目的是:
1,首两行的热键始终有效;
2,余下的热键 都 必须在 非输入文字的前提下,映射才有效;
换言之,凡是屏幕上任何地方有 小竖线 在闪烁 等待输入 文字/英文/数字 ,包括地址栏或文本框 之类 已有一段文本被选中高亮……等,
这样按下z x a s q 这些键,效果都等于正常本来的字母。
闪烁符号消失,映射恢复有效。

应该添加 什么语句呢?
我是语法文盲,希望出手相助的朋友能写出完整语句。
谢谢。

以下是提及的脚本:
代码: (全选)
Rwin::^space
AppsKey::^w

CapsLock::MButton

z::PgUp

x::PgDn

*a up::send {shift up}{ctrl up}{LButton up}
*a::
GetKeyState, LButtonState, LButton  ;
if LButtonState = U  ;
send {shift down}{ctrl down}{LButton down}  ;
return

*s up::send {shift up}{ctrl up}{RButton up}
*s::
GetKeyState, RButtonState, RButton  ;
if RButtonState = U  ;
send {shift down}{ctrl down}{RButton down}  ;
return

*q up::send {shift up}{ctrl up}{MButton up}
*q::
GetKeyState, MButtonState, MButton  ;
if MButtonState = U  ;
send {shift down}{ctrl down}{MButton down}  ;
return
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-22, 18 : 21
 
用#if 檢查 A_cursor 及 A_CaretX A_CaretY 的狀態
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-22, 21 : 04
 
引用:用#if 檢查 A_cursor 及 A_CaretX A_CaretY 的狀態
jony.tw 发表于 2012-9-22 18:21 [Image: back.gif]
你好,多谢回应。请问具体语句怎样写?加插在什么位置?这方面,我真的完全文盲的。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-23, 12 : 01
 
[i=s] 本帖最后由 jony.tw 于 2012-9-23 12:04 编辑 [/i]

代码: (全选)
;按ctrl-alt-F1 取得目前IBeam位置, 這邊定義的快鍵全域有效
^!f1::
tooltip % A_CaretX . "  " . A_CaretY
return

#if ( A_CaretX = 0) ;其實是找不到IBeam..
{
;沒有IBeam的窗口, 這群快速鍵被激活
a::run www.google.com ;單字快鍵
b::send {Lwin}
c::send {Lwin down}e{Lwin up}
e::{ctrl down}w{ctrl up}
f::return
g::return
}

#if not ( A_CaretX = 0)
{
;有IBeam的窗口, 這群快速鍵被激活
#e::return  ;停用叫用檔案總管的Win-e
Lwin::return ;停用左Win鍵_彈出視窗
}
只檢查A_CaretX 可能太含糊...試過只剩Desktop找不到IBeam..
所以..最好再加入一些其他條件比較靈活
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-23, 14 : 25
 
引用:;按ctrl-alt-F1 取得目前IBeam位置, 這邊定義的快鍵全域有效
^!f1::
tooltip % A_CaretX . " " . A_CaretY
return

#if ( A_CaretX = 0) ;其實是找不到IBeam..
{
;沒有IBeam的窗口, 這群快速鍵被激活
a::ru ...
jony.tw 发表于 2012-9-23 12:01 [Image: back.gif]
非常感谢你出手,读起来 感觉 好像接近个这个调子了,
我这就去尝试 基于你的示例 研究下,稍后会尽快情况报告上来,一起探讨。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-23, 18 : 28
 
代码: (全选)
#Persistent
CoordMode Mouse, Screen
SetTimer, CursorPos, 100
return

#if ( Cur_y < 80 )
{
;;若游標在視窗上缘 這群快速鍵被激活
a::run www.google.com
b::send {Lwin}
c::send {Lwin down}e{Lwin up}
e::return
f::return
g::return
}

#if ( Cur_x > A_ScreenWidth-800)
{
;若游標在視窗右缘, 這群快速鍵被激活
#e::return
Lwin::return
}



CursorPos:
MouseGetPos, Cur_X, Cur_y, Cur_Win, Cur_Ctrl, 3
ToolTip % "x" Cur_X . "  y" . Cur_y , A_ScreenWidth-300, 0 , 1 ;. "`n" . Cur_Win . " " . Cur_Ctrl
return
用鼠標位置作分別也是種辦法
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-24, 08 : 56
 
[i=s] 本帖最后由 jony.tw 于 2012-9-24 09:32 编辑 [/i]

在四樓的開端加上這行會更理想些...

CoordMode Caret, Client

條件要再嚴格些以免生失誤
#if (A_CaretX = 0 AND A_CaretY =0)
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-24, 09 : 19
 
[i=s] 本帖最后由 roy2012 于 2012-9-24 09:29 编辑 [/i]

引用:在四樓的開端加上這行會更理想些...

CoordMode Caret, Client
jony.tw 发表于 2012-9-24 08:56 [Image: back.gif]
Hi,经过 反复 试验,四楼的开头 需要 按键来 开始 ,不够自动化,我本意是 脚本运行后 持续 检查,每几百毫秒一次,那种。
但是 参考了下面这个 语句,效果 总是 显示坐标。。。而且我不知道怎样和 if 组合。怎样修改才是 只 检查 不显示呢?
代码: (全选)
#Persistent
#NoEnv
SetTimer, WatchCaret, 400
return
WatchCaret:
ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX +50, A_CaretY + 20
return
另外一个大问题就是,检查 caret 的方式,无论 画面 有没有 文本插入点 活动,都 有坐标,不能形成 条件。。。
我再试试 你建议的 CoordMode Caret, Client
也许这样 可以在 没有 文本插入点 活动的情况下 获得 绝对坐标 0 0 的效果,
我稍后再回来反应情况。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-24, 09 : 39
 
[i=s] 本帖最后由 jony.tw 于 2012-9-24 09:47 编辑 [/i]

tooltip, % "cX" . A_CaretX . " cY" . A_CaretY, A_ScreenWidth-300, 0 , 1

參考一下HELP吧!看了一下你的表法也沒錯!想想你是誤會了!

A_CaretX, A_CaretY 沒這段也是一直有浮動值的,做個可視數值只為方便除錯(DEBUG)
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-25, 08 : 49
 
[i=s] 本帖最后由 jony.tw 于 2012-9-25 10:10 编辑 [/i]

把ControlGetFocus加進來...這樣明白多了!
也許不能很簡單的一網打盡所有編輯狀態但比抓A_CaretX明確多了
代码: (全选)
#Persistent
CoordMode  ToolTip | Mouse , Screen
SetTimer, CursorPos, 600 ;昨天設太快以到DoubleClick都被屏敝了....:P
return

#if not (inStr(theFocus , "Edit") or  (theFocus = "Scintilla1") or ( WinClass = "OperaWindowClass" ) or (theFocus ="DirectUIHWND1") )
{

a::run www.google.com
b::send {Lwin}
c::send {Lwin down}e{Lwin up}
e::Lwin
f::return
g::return
}

#if  (inStr(theFocus , "Edit") or  (theFocus = "Scintilla1") or ( WinClass = "OperaWindowClass" ) or (theFocus ="DirectUIHWND1") )
{

#e::return
Lwin::return
}



CursorPos:
MouseGetPos, Cur_X, Cur_y, Cur_Win, Cur_Ctrl, 1 ; 取得游標下的位置, 視窗(HWND/句柄). 控件标识符
ControlGetFocus theFocus, A ; 取得目前活動窗口 的焦點之控件标识符
WinGetClass, WinClass, A
ToolTip % "x" Cur_X . "  y" . Cur_y . "  " . theFocus . "`n" . WinClass . " " . Cur_Win . " " . Cur_Ctrl  , A_ScreenWidth/2, 0 , 1
return

;唯一 ID/HWND (ahk_id): 所有的窗口命令都可以通过窗口或控件的唯一 ID 号对特定的窗口或控件进行操作. 例如: WinActivate ahk_id %VarContainingID%. 窗口的 ID 通常通过 WinExist() 或 WinGet 获取. 控件的 ID 通常通过 ControlGet Hwnd, MouseGetPos 或 DllCall 获取. 此外, ahk_id 还能操作隐藏的控件; 即不受 DetectHiddenWindows 设置的影响.

;試著去掃一遍你常用的編輯窗口 發現標準的對話框.大部份都有edit開頭...即使有自己的別名也可以用列舉的方式去判斷
;再加上對Win_ID的判斷...theFocus變數大概能很清晰的分別是不是編輯框
;但是有很多軟體的的控件是用不同方式做的探不到...就不可能很容易的分辦了...那就要繞彎處理...用個快鍵切換也行啊!
加了些我自己找到的窗口判斷
(WinClass = "OperaWindowClass") 當前窗口是 OPERA ps..抓不到標準控件...
(theFocus = "Scintilla1")是 Scite的編輯框控件
(theFocus ="DirectUIHWND1")是檔案總管(Win+e開啟的)搜尋框...
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-25, 11 : 56
 
引用:把ControlGetFocus加進來...這樣明白多了!
也許不能很簡單的一網打盡所有編輯狀態但比抓A_CaretX明確多了#Persistent
CoordMode ToolTip | Mouse , Screen
SetTimer, CursorPos, 600 ;昨天設太快以到DoubleC ...
jony.tw 发表于 2012-9-25 08:49 [Image: back.gif]
Hi,jony.tw,你很有很好的分享与探讨的态度,令人喜爱。
我有一个进展要和你分享,在网上 找来 修改的,测试有效。
每500毫秒检查一次光标,如果= IBeam ,就 suspend 脚本。
代码: (全选)
#Persistent

SetTitleMatchMode, 2

#IfWinActive, Executive  ,
   SetTimer, timer_MonitorCursor, 500
   return

   timer_MonitorCursor:
      If A_Cursor = IBeam
      {
         Suspend On
      }
Else
{
Suspend Off
}
   return
#IfWinActive

现在,我想进一步完善成为:检查到 有 字符插入点 在活动(IBeam闪动) 才 suspend,你有什么建议?
因为 光标 在 网页上 遇到任何文字也会变成 IBeam。


以下是网上找到的原文:
代码: (全选)
#Persistent

SetTitleMatchMode, 2

#IfWinActive, Executive Demo Player,                                                  
   SetTimer, timer_MonitorCursor, 30
   return

   timer_MonitorCursor:
      If A_Cursor = IBeam
      {
         Send, {Tab}
      }
   return
#IfWinActive
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-26, 00 : 04
 
[i=s] 本帖最后由 roy2012 于 2012-9-26 00:11 编辑 [/i]

引用:把ControlGetFocus加進來...這樣明白多了!
也許不能很簡單的一網打盡所有編輯狀態但比抓A_CaretX明確多了#Persistent
CoordMode ToolTip | Mouse , Screen
SetTimer, CursorPos, 600 ;昨天設太快以到DoubleC ...
jony.tw 发表于 2012-9-25 08:49 [Image: back.gif]
下面这个脚本是有效 自动 切换 Suspend On/Off 的,
由于A_CaretX和A_CaretY 在某些窗口是经常会不能更新坐标,这点在 帮助文档也说了是AHk的自身问题。
现在就差一步了,不能依赖 坐标,
就是If A_CaretX > 100 这里 要变成 caret 是否 活动的 (或 可见的 / 闪动的),
也就是说,是否有 等待 插入字符 的状态,有,就Suspend,
这个条件怎样表达呢?怎样写成语句?就差这一句了。
代码: (全选)
#Persistent

SetTitleMatchMode, 2

SetTimer, WatchCaret, 600
return

WatchCaret:
ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX, A_CaretY - 40

If  A_CaretX > 100
{
Suspend On
}
Else
{
Suspend Off
}
return
#IfWinActive

z::a
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-26, 09 : 47
 
[i=s] 本帖最后由 jony.tw 于 2012-9-26 10:04 编辑 [/i]

因為問題並不單純!在我最後發的那個版本!後來加了一些判斷例...

像Opera隱藏了所有Windows Spy可以探到的標準Control(控件)
(或者根本不使用Windows的標準控件Edit)...
所以在#IF裡全部捨掉 焦點在Opera窗口時 也屏敝掉.
同樣的例子在OpenOffice也是什麼都探不到的..只有一些對話框有效 有EDIT框出現



但即使在Desktop你可以用單字快鍵(快打選檔失效了), 改檔名時卻出現了EDIT框
這就擋到 用焦點判斷顯然比判斷游標...游標下的物件有效..
因為你一打字就會進入焦點框..包括Save Open狀態都找得到Edit框
甚至在繪圖軟體打字塊..



而IBeam與游標判斷很難有效!包括看不能改的HELP, PDF都會出IBeam...而CaretX, CaretY的判讀,可能在上述焦點判斷無效時為之,但仍不保証一定有效!
假設我們偷偷輸入幾個字再刪除...並在此期間抓CaretX的變化可能會很明確知道輸入焦點在哪?可否編輯!要不要停用單字快鍵!

不過很多情況可能並不單純...用人工判斷以快鍵做切換狀態

並顯示輸入模式可能會比較簡單明確!

Suspend 會停掉所有快鍵及熱字串...我知道那不是預期的
在輸入狀態也常用熱字串不是嗎?
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-26, 11 : 11
 
查了一下0x0007 WM_SETFOCUS 可以檢查窗內是否有文本焦點...沒有的話wParam傳回NULL

不過在下對微軟的Message DllCall都還不夠熟...搞半天沒下文...請版大出手救我們吧!
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-26, 12 : 19
 
没有通用的方法 A_Caret 应软件的不同而表现的各不相同,不宜作为通用的标准,只对特定软件的判断有许作用

我觉得还是判断当前激活控件的类名比较可靠
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-26, 12 : 45
 
[i=s] 本帖最后由 jony.tw 于 2012-9-26 12:54 编辑 [/i]

我贊同舉手貓大說的,A_caret真的無法通用於所有軟體

但是看到別人繞彎解決了(前一個人回答AHK不可能做到)的問題...

如果探得到A_caret 送一個字元出去讓A_Caret移動..判斷後..再決定刪回....

這可能做為進一歩分別游標是否在編輯區塊內
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-26, 12 : 48
 
有些没有编辑框的 你输入任何字符 a_caret也会变化
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-26, 13 : 54
 
引用:没有通用的方法 A_Caret 应软件的不同而表现的各不相同,不宜作为通用的标准,只对特定软件的判断有许作用

我觉得还是判断当前激活控件的类名比较可靠
nepter 发表于 2012-9-26 12:19 [Image: back.gif]
实例,我现在用谷歌浏览器在这个论坛,
利用SPY获取的资料显示 ,网页的内容 和 底部的 回复 框,两者无论谁获得焦点,大多数资料都是一样,
ahk_class Chrome_WidgetWin_1
ClassNN:
Chrome_RenderWidgetHostHWND13
只有一些坐标和颜色 不同。
这样无法构成判断条件。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-26, 14 : 16
 
网页元素无法判断
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-09-26, 15 : 25
 
引用:因為問題並不單純!在我最後發的那個版本!後來加了一些判斷例...

像Opera隱藏了所有Windows Spy可以探到的標準Control(控件)
(或者根本不使用Windows的標準控件Edit)...
所以在#IF裡全部捨掉 焦點在Opera窗口 ...
jony.tw 发表于 2012-9-26 09:47 [Image: back.gif]
对,没有错,游标 是难以托付的,很多时候 游标字符插入点 分别在不同 位置,
而且,某些图形软体的 字母/数字 输入框 都很紧凑,一旦 游标 偏离了,就不再 =IBeam。

加入人工快捷键 这点不能纳入考虑,
每 增加 零点零几秒的注意力转移,对于思考连贯性的影响将会是放大万倍的。
有心运用脚本就必须全自动智能化,起码 对于 个人常用软体 是这样。
以我为例,常用的就几个软体:
1,谷歌浏览器 和 IE,
2,三款图形软体,
3,记事本 和 便笺,
4,Windows资源管理器,
5,没有5了。
像我这样的情况,只有在 插入 字母/数字/文字 的时候才 需要 字母=字母,
其余情况,字母都被 映射为热键。
我 对于 任何可以将事情变得 更简易 更人性化 ,有一种 固执 和 渴求。
尽管很多人 为了 能熟练的 同时按三四个组合键 来执行 软体 命令 而感到自豪,
但我认为任何超过1个按键的 快捷键 都必须被唾弃的。
(这也是我接触Autohotkey的起因)
我的物理键盘全部键帽都是可编辑的,现在有100多个按键 被映射 成热键,
每个物理键帽上 都有 相应命令的 名称和图标。想做什么都是一指禅。
现在就 等解决 【AHK根据打字与否,自动切换是否映射】 这个问题。

热字串的问题,输入法的 自定义 字词,完全可以取代AHK。

Suspend 只是用来举例,只要 能 解决自动化,就能修改成任何个人想要的 变化。
而且,Suspend只会对 内藏Suspend指令的那个脚本 执行Suspend。
同时运行几个脚本 可以 满足 常驻 与 可变 并存的要求。

回到主题,你认为AHK 有没有 类似 Caret = Visible or invisible 这中语法?
或近似的语法呢?
对于电脑,Caret是否在闪动/活动 这是究极重要的元素,
AHK的作者应该不会 没考虑到的吧。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
发表回复 


论坛跳转:


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