***win10***中.,每次开机启动后,讯飞语音就会弹出悬浮框.怎么办
我想利用最小化托盘软件,将指定软件最小化到托盘。RBTray和Traymond已经用过,用不了
悬浮框如下,手动关闭后只要使用语音快捷键,就又会弹出悬浮框.
我的方案是直接把悬浮窗移出显示器范围。
我用ahk就能隐藏窗口,关键是我偶尔要点开悬浮框
所以我需要的是隐藏到托盘,而不是隐藏窗口(有时候使用重启电脑后 运行ahk并未启动,需要判断讯飞语音到底有没启动),
最主要的是讯飞启动后有时候是开启语音的状态,有时候是关闭的状态,搞不懂
要是讯飞启动默认关闭或者开启语音,就好隐藏窗口,这样用f6快捷键决定是否开启语音
;AutoHotkey V1.0 不支持直接使用 PNG 和 JPG 两种格式的图片作为图标
Menu, Tray, Icon, D:\Green\讯飞语音输入独立版 V3.0\iFlyVoice.exe, 1
/*
AutoHotkey version: 1.0
OS: Win7
name: voice2text.ahk
name-CN: voice2text.ahk
version:
author: Yolanda
namespace: QQ:2474499561
time: 2023年12月16日
description:
更新说明
V3.0-2020426
1.增加了语音输入的时间。超过180秒就暂停。录入语音的同时一直显示"now listening~~"。
2.停止该语句:
;send, {F6} ;暂停启动后默认开启的语音功能,留至后面动作判断
20240630
使用该语句send, {F6}
v2.0-20231216
1.通过win+h键实现讯飞语音的总开关。(20240426将win+m改为win+h)
2.实现语音输入时静音
v1.0-20231216
1.隐藏讯飞语音的弹窗
2.通过鼠标左键,点击来开启或者关闭语音
*/
;=====================================================================o
; 铅笔键:
;---------------------------------o-----------------------------------o
global midindex := 1
mid_disable_flag := ""
mid_click_flag := ""
sleep, 2000
Run, iFlyVoice.exe, D:\Green\讯飞语音输入独立版 V3.0, hide
;Run, iFlyVoice.exe, D:\Green\讯飞语音输入独立版 V3.0
winwait, 语音悬浮窗
;下面这行代码的作用是直接隐藏“语音悬浮窗”窗口,从而达到隐藏窗口的效果。
;WinHide, 语音悬浮窗 ;win7中有效
;PostMessage, 0x0112, 0xF020,,, 语音悬浮窗 ;win10中有效
send, {F6} ;暂停启动后默认开启的语音功能,留至后面动作判断 (不注释的原因是启动程序后会自动开启语音)
Sleep, 1000
;---------------------------------o-----------------------------------o
;V3.1版本-2020426-start-失败
;---------------------------------o-----------------------------------o
/*
#h::
mid_disable_flag := mid_disable_flag == "" ? 1 : ""
return
LWin & space::
If (A_Cursor = "IBeam") {
Edit_Mode := 1
if ((Mod(midindex, 2) = 1) && mid_disable_flag = "") {
;SoundGet, master_volume
;SoundSet, 0
;Run, iFlyVoice.exe, D:\Green\讯飞语音输入独立版 V3.0
send, {F6 down}
ToolTip, now listening~~
mid_click_flag = 1
last_input_time := A_TickCount ; 记录当前时间
SetTimer, CheckInput, 1000 ; 检查键盘输入,每秒检查一次
SetTimer, CloseMic, 30000 ; 设置定时器,0.5分钟后关闭语音输入
Sleep, 1000
ToolTip
} else {
;SoundSet, master_volume
send, {F6 up}
ToolTip, mic closed~~
;Run, iFlyVoice.exe, D:\Green\讯飞语音输入独立版 V3.0, hide
SetTimer, RemoveToolTip, -500
mid_click_flag = ""
Sleep, 1000
ToolTip
}
midindex := midindex + 1
} else if (A_Cursor = "Arrow") {
Edit_Mode := 0
last_input_time := A_TickCount ; 记录当前时间
SetTimer, CheckInput, 1000 ; 检查键盘输入,每秒检查一次
}
Return
CheckInput:
if (A_TickCount - last_input_time >= 5000) {
SetTimer, CloseMic, 30000 ; 如果5秒内无键盘输入,重新设置定时器,0.5分钟后关闭语音输入
} else {
SetTimer, CloseMic, Off ; 如果有键盘输入,暂停关闭语音输入定时器
}
Return
CloseMic:
send, {F6 up} ; 关闭语音输入
ToolTip, mic closed~~
;Run, iFlyVoice.exe, D:\Green\讯飞语音输入独立版 V3.0, hide Thank you.
SetTimer, RemoveToolTip, -500
mid_click_flag = ""
Return
RemoveToolTip:
ToolTip
Return
*/
;---------------------------------o-----------------------------------o
;V3.1版本-2020426-end-失败
;---------------------------------o-----------------------------------o
/*
目的:当输入文字时,记录下当前 文本框的class名字,如果1秒内检测到当前文本框class中无文本输入,则重新设置定时器CloseMic,5分钟后关闭语音输入。" 原有代码不能实现需求,请检查错误,并给出修改后的完整ahk脚本,并注释修改部分
失败测试:ai测试过各种识别输入文本变化之法
1.A_TickCount
2.使用GetActiveWindowText()函数来获取当前活动窗口的文本
3.使用GetCursorText()函数来获取光标位置的文本
4.使用GetFocusedControlText()获取当前焦点文本框中的文本
5.尝试模拟键盘事件来检测文本框中的文本变化(使用控件的事件来检测文本框中的文本变化,ahk不支持)
6.SoundGet, mic_volume, MICROPHONE
参考:
要判断用户是否持续输入文字,可以通过以下几种方法实现:
定时器检查:设置定时器,每隔一定时间检查一次文本框中的文本是否发生变化。如果发生变化,则表示用户正在输入文字。
控件事件:有些编程语言或框架支持文本框的事件监听,你可以通过这些事件来检测文本框中的文本是否发生变化。
Hook键盘输入:使用键盘钩子来监视键盘输入,在用户输入文字时触发相应的操作。
API调用:有些软件可能提供了API来检测用户输入的状态,你可以查阅相关文档来了解如何使用这些API。
成功的地方:
以后有可用的api或者方法,可以直接利用现有框架的代码调用api或者方法
*/
;---------------------------------o-----------------------------------o
;---------------------------------o-----------------------------------o
;V3版本-2020426-start-现行
;---------------------------------o-----------------------------------o
;Ctrl+Alt+s
;^!s::
#y::
mid_disable_flag := mid_disable_flag == "" ? 1 : ""
return
LAlt & LButton::
If (A_Cursor = "IBeam") {
Edit_Mode := 1
if ((Mod(midindex, 2) = 1) && mid_disable_flag = "") {
;SoundGet, master_volume
;SoundSet, 0
send, {F6 down}
;send, {F6 up}
;send, {F6 down}
ToolTip, now listening~~
mid_click_flag = 1
SetTimer, CloseMic, 180000 ; 设置定时器,180秒后关闭语音输入
} else {
;SoundSet, master_volume
send, {F6 up}
ToolTip, mic closed~~
SetTimer, RemoveToolTip, -500
mid_click_flag = ""
}
midindex := midindex + 1
} else if (A_Cursor = "Arrow") {
Edit_Mode := 0
}
Return
;无效的时候,在快捷键的前面取消/添加~
LAlt & space::
;无反应的使用,可以按键win+lalt+space来激活
If (A_Cursor = "IBeam") {
Edit_Mode := 1
if ((Mod(midindex, 2) = 1) && mid_disable_flag = "") {
;SoundGet, master_volume
;SoundSet, 0
send, {F6 down}
ToolTip, now listening~~
mid_click_flag = 1
SetTimer, CloseMic, 180000 ; 设置定时器,180秒后关闭语音输入 ;若为正数是重复定时器 此类定时器需要使用 SetTimer, CloseMic, Off 来关闭。
} else {
;SoundSet, master_volume
send, {F6 up}
ToolTip, mic closed~~
SetTimer, RemoveToolTip, -500
mid_click_flag = ""
}
midindex := midindex + 1
} else if (A_Cursor = "Arrow") {
Edit_Mode := 0
}
Return
CloseMic:
send, {F6 up} ; 关闭语音输入
ToolTip, mic closed~~
SetTimer, RemoveToolTip, -500 ; 一次性定时器;用于在500ms后显示提示框,然后关闭提示框
mid_click_flag = ""
midindex := midindex + 1
Return
RemoveToolTip:
ToolTip
return
;---------------------------------o-----------------------------------o
;V3版本-2020426-end-现行
;---------------------------------o-----------------------------------o
;---------------------------------o-----------------------------------o
;V2版本-20231216-start-暂停
;---------------------------------o-----------------------------------o
/*
#h::
mid_disable_flag := mid_disable_flag == "" ? 1 : ""
return
~LWin & LButton::
If (A_Cursor = "IBeam") {
Edit_Mode := 1
if ((Mod(midindex, 2) = 1) && mid_disable_flag = "") {
;SoundGet, master_volume
;SoundSet, 0
send, {F6 down}
ToolTip, now listening~~
mid_click_flag = 1
Sleep, 1000
ToolTip
} else {
;SoundSet, master_volume
send, {F6 up}
ToolTip, mic closed~~
SetTimer, RemoveToolTip, -500
mid_click_flag = ""
Sleep, 1000
ToolTip
}
midindex := midindex + 1
} else if (A_Cursor = "Arrow") {
Edit_Mode := 0
}
Return
~LWin & space::
If (A_Cursor = "IBeam") {
Edit_Mode := 1
if ((Mod(midindex, 2) = 1) && mid_disable_flag = "") {
;SoundGet, master_volume
;SoundSet, 0
send, {F6 down}
ToolTip, now listening~~
mid_click_flag = 1
Sleep, 1000
ToolTip
} else {
;SoundSet, master_volume
send, {F6 up}
ToolTip, mic closed~~
SetTimer, RemoveToolTip, -500
mid_click_flag = ""
Sleep, 1000
ToolTip
}
midindex := midindex + 1
} else if (A_Cursor = "Arrow") {
Edit_Mode := 0
}
Return
RemoveToolTip:
ToolTip
return
*/
;---------------------------------o-----------------------------------o
;V2版本-20231216-end-暂停
;---------------------------------o-----------------------------------o
;---------------------------------o-----------------------------------o
;V2版本-test-20231216-start
;---------------------------------o-----------------------------------o
/*
#h::
send, {F6}
return
*/
;说明效果:如果简单替换快捷键的话,不能实现"光标非文本框的时候,禁止语音输入"
;---------------------------------o-----------------------------------o
;V2版本-test-20231216-end
;---------------------------------o-----------------------------------o
;=====================================================================o
;=====================================================================o
; 参考学习
;---------------------------------o-----------------------------------o
/*
1.如何实现窗口的隐藏?
分析:
办法1:WinHide, 语音悬浮窗 ;这行代码的作用是直接隐藏“语音悬浮窗”窗口,从而达到隐藏窗口的效果。
办法2:WinSet, ExStyle, ^0x20, 语音悬浮窗 ; 这行代码的作用是将“语音悬浮窗”窗口的样式属性中的 WS_EX_TRANSPARENT 标志位清除,从而使窗口不再显示在屏幕上。
办法3:" PostMessage, 0x0112, 0xF020,,, 语音悬浮窗 ;隐藏悬浮窗"AHK PostMessage 隐藏悬浮窗在两台电脑上一个能work一个不行(原因:窗口标识符不一致:语音悬浮窗 可能在两台电脑上具有不同的窗口标识符或标题。如果标识符或标题不正确,PostMessage 命令就无法准确地找到要隐藏的窗口。窗口权限限制:某些窗口可能具有权限设置,阻止其他应用程序向其发送消息或执行特定的系统命令。这可能是导致在某些电脑上无法隐藏悬浮窗的原因之一。不同的操作系统或应用程序版本:不同的操作系统或应用程序版本可能会对窗口管理和消息处理方式进行了更改,导致 PostMessage 命令在不同的环境中表现不同。)
解决:只有办法1适用
*/
;---------------------------------o-----------------------------------o
好长,被吓到,就是想一键启动讯飞语音识别吗?
是啊,以前自己写的ahk脚本
改了个脚本,你试试哈:
#NoEnv
#Persistent
#SingleInstance, Force
SetFormat, IntegerFast, Hex
SetBatchLines, -1
SetWinDelay, -1
global Cached_Windows := {}
Menu, Tray, NoStandard
Menu, Tray, Icon, C:\Windows\system32\shell32.dll, 3
Menu, Tray, Add, showui, showui
Menu, Tray, Add, Exit, Exit
Menu, Tray, Icon, Exit, C:\Windows\system32\shell32.dll, 113
Menu, Tray, Click, 1
Menu, Tray, default, showui
WinWait,语音悬浮窗 ahk_exe iFlyVoice.exe
WinGet, WinID, ID,ahk_exe iFlyVoice.exe
WinGet, WinIcon, ProcessPath, ahk_id %WinID%
ObjRawSet(Cached_Windows, WinID, WinID)
Menu, Tray, Icon, %WinIcon%,2
WinHide, ahk_id %WinID%
winhide, ahk_exe iFlyVoice.exe
return
showui:
if ! WinExist("ahk_exe iFlyVoice.exe")
{
WinShow, ahk_id %WinID%
Cached_Windows.Delete(WinID)
}else{
WinGet, WinID, ID,ahk_exe iFlyVoice.exe
ObjRawSet(Cached_Windows, WinID, WinID)
Menu, Tray, Icon, %WinIcon%,2
WinHide, ahk_id %WinID%
winhide, ahk_exe iFlyVoice.exe
}
return
Exit:
For index, WinID in Cached_Windows {
WinShow, ahk_id %WinID%
}
ExitApp
return
贴个我自己的解决方案,不过现在不用了,因为有时候几次输入不成功,搞心态。
可能是 AHK 2.0 语法
XButton1::
{
; 这里获取当前语音输入进程的 PID
iFlyPID := ProcessExist("iFlyVoice.exe")
; 判断是否存在该 PID
if(iFlyPID==0)
{
; 不存在则运行对应的快捷方式,前面代码比较长,是为了能够隐藏提权提醒(以管理员方式进行运行)
Run "startVoiceInput.bat", ,"Hide"
} Else {
; 如果存在此进程则结束它
ProcessClose iFlyPID
}
Return
}
下面的 bat 是为了绕提权提示的(我记得我后来合并到 AHK 代码里边了……记不清
set __COMPAT_LAYER=RUNASINVOKER && start 语音悬浮窗.lnk
大段代码请用反引号包裹,否则容易被论坛系统错误渲染,造成代码无法正常显示。比如:
```python
print("hello")
```
此外,大篇幅代码被包裹后,过长内容可以被系统自动折叠,这样阅读体验更佳。
论坛里有介绍过,Traymond
你可以加一个脚本,自动读取exe清单喂给它,实现自动化隐藏
求指导,看了官方网站,没提到这种方法
你好 我是用的有道翻译 一用截图翻译在任务栏了 我之前使用火绒拦截窗口不行 用了Traymond隐藏了 ,一用截图翻译有出来了
这个语音输入在主界面被唤起时会重启进程,因此这里尝试在基于需求不变的情况下变更思路:
1.直接删除常规语音识别程序的窗口相关代码
2.写一个托盘程序并补充一个正常语音识别程序,使得需要时可以通过托盘唤起正常语音识别程序的界面
3.设置托盘程序开机启动
https://www.lanzouw.com/b00mok3xgf
密码:gtzk
已附上源码,其中
iFlyVoice.exe是已被删除显示窗口的代码的语音识别程序
iFlyVoice_OBAK.exe是原版语音识别程序
tray.exe是唤起iFlyVoice_OBAK.exe的托盘程序,需要开机启动
tray.cpp是tray.exe的源码,编程语言为C++
inst.exe是在您的系统已经安装最新版3.0.1736讯飞输入法的前提下,尝试进行一键快速安装的安装程序
inst.txt是inst.exe的内置脚本代码,编程语言为PECMD2012
install.log(在inst.exe运行后出现) 是安装记录,您可以通过其判断快速安装是否成功,若失败,尝试dbg、手动安装或其他操作
手动安装步骤:
终止iFlyVoice.exe进程(需要管理员权限)
将包内iFlyVoice.exe替换掉已安装的讯飞输入法中的iFlyVoice.exe
复制iFlyVoice_OBAK.exe、tray.exe到iFlyVoice.exe同目录下
设定tray.exe开机启动
另,您可以使用fc命令对包内iFlyVoice.exe与已安装的讯飞输入法中的iFlyVoice.exe执行二进制比较以确认安全性,其余程序未更改或已附上源码
;制作列表,激活标的程序,自动按快捷键
DetectHiddenWindows, on
ifwinnotexist ahk_exe traymond.exe
run A_ScriptDir\traymond.exe
sleep 500
global keeponcount := 0
Loop, d:\tool_s\隐藏到tray*.lnk
{
FileList = %FileList%%A_LoopFileLongPath%n } FileList := regexreplace(FileList, "^[\s]\n","") ;尝试去除空行 Loop, parse, FileList, n
{
if not A_LoopField ; 忽略列表末尾的最后一个换行符 (空项).
continue
StringSplit, fileitem, A_LoopField, A_Tab ; 用 tab 作为分隔符将其分为两部分.
fileitem1 := LTrim(fileitem1)
fileitem1 := RTrim(fileitem1)
fileitem1 := RTrim(fileitem1,“")
fileitem1 := RTrim(fileitem1,”/“)
FileGetShortcut, fileitem1 , OutTarget, OutDir
if (errorlevel) ; hidden or system files (like desktop.ini) returns an error
continue
if not FileExist(OutTarget) ; if folder/document was delete or on a removable drive
continue
realname := RegExreplace(OutTarget , “^.*\([^\]+)$”,”$1")
keeponcount += 1 ;有效才加1
ahkkeepon%keeponcount% := realname
}
Loop keeponcount
{
watchprocess := ahkkeepon%A_Index%
IfWinExist, ahk_exe watchprocess
{
try {
winactivate ahk_exe watchprocess
winwaitactive ahk_exe watchprocess
;send {win down}{shift down}z{shift up}{win up}
send #+z
} catch {
sleep 10
continue
}
}
}
sleep 300
if winexist(“Traymond ahk_class #32770 ahk_exe traymond.exe”) {
winactivate Traymond ahk_class #32770 ahk_exe traymond.exe
send {space}
}
exitapp