网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
02月27日漏签0天
autohotkey吧 关注:4,738贴子:16,359
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 15回复贴,共1页
<<返回autohotkey吧
>0< 加载中...

发现这样取色是快了,但是又一个问题求解决

  • 只看楼主
  • 收藏

  • 回复
  • xp1413
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
之前把所有需要的按键每条都取色一次,发现按键响应的有点慢,于是在吧里大佬们的提醒下自己到处抄写了2个脚本一起执行,速度是快的飞起了,但是会占用剪切板,请问有什么别的方法可以套用吗?
我的第一个脚本如下,把指定点的颜色代码复制到剪切板
~F1::
Loop
{
PixelGetColor, color , 111 , 222 , rgb
StringLower , colorLower , color
Clipboard = %colorLower%
}
Return
然后另一个脚本根据剪切板的值send按键
~F1::
Loop
{
if (GetKeyState("1","P") )
break
if (Clipboard = 0x010101)
send {a}
sleep 0
if (GetKeyState("1","P") )
break
if (Clipboard = 0x010102)
send {b}
sleep 0
}
这样确实按照我想的按F1就自动开始了,不过还是开头说的占用剪切板.请问能用别的什么实现吗?
return


  • OTA
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你能做到这个地步真不简单
我这边有两种不占用剪切板的方式给你做参考
AHK的缺点是两个脚本之间无法使用常规方法互通变量,因此当时我遇到类似问题时看到别的大佬采取了如下方式
1、直接把值写到INI文件中,通过读取INI获取变量
2、或者写进内存,读取内存的值获取变量
我个人采用一种比较笨拙的方式,就是按键宏脚本自身先生成一个荧幕外的GUI,而取色宏使用postMessage将取色结果发送到该GUI,然后通过按键脚本读取自身GUI的内容,间接获取取色宏的变量


2026-02-27 23:51:26
广告
不感兴趣
开通SVIP免广告
  • OTA
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个就是先分配内存大小和地址,并且将内存地址写进剪切板里,然后将字符串写进对应地址的内存中。然后通过读取剪切板的内存地址信息,读到该地址的文字
;写
size := 1024 ; 分配的内存大小为1024字节
ptr := DllCall("GlobalAlloc", "UInt", 0x40, "UInt", size) ; 分配内存,并返回内存地址
clipboard := "" ; 让剪贴板初始为空
clipboard = %ptr%
str := "这是字符串"
char_num := StrPut(str, ptr, -1, "UTF-16") ; 将字符串复制到内存地址中
;读
char_num := 1024 ; 假设我们要读取1024个字符
str := StrGet(clipboard, char_num, "UTF-16") ; 从剪切板的内存地址中读取字符串
DllCall("GlobalFree", "UInt", clipboard) ; 释放剪切板的内存地址的内存
MsgBox % str ; 显示结果


  • OTA
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@eisenhower
你若是要在两个脚本之间单向传递字符串可以用如下方式:
建立两个脚本
接收字符串的脚本起个名字,比如1.ahk
发送字符的脚本名称无所谓
【发送端】的内容
F1::
StringToSend = 这里改成你想发送的内容 ;发送的字符串
TargetScriptTitle := "1.ahk ahk_class AutoHotkey" ;接收上方字符串的脚本全名
Send_WM_COPYDATA(StringToSend, TargetScriptTitle) ;发送字符串到其他脚本的动作
return
Send_WM_COPYDATA(ByRef StringToSend, ByRef TargetScriptTitle)
{
VarSetCapacity(CopyDataStruct, 3*A_PtrSize, 0)
SizeInBytes := (StrLen(StringToSend) + 1) * (A_IsUnicode ? 2 : 1)
NumPut(SizeInBytes, CopyDataStruct, A_PtrSize)
NumPut(&StringToSend, CopyDataStruct, 2*A_PtrSize)
Prev_DetectHiddenWindows := A_DetectHiddenWindows
Prev_TitleMatchMode := A_TitleMatchMode
DetectHiddenWindows On
SetTitleMatchMode 2
SendMessage, 0x004A, 0, &CopyDataStruct,, %TargetScriptTitle%
DetectHiddenWindows %Prev_DetectHiddenWindows%
SetTitleMatchMode %Prev_TitleMatchMode%
return ErrorLevel
}
【接收端 】1.ahk的内容
global CopyOfData := "未接收到任何值" ;定义接收字符串的变量为全局,以便在本脚本引用
F2::
OnMessage(0x004A, "Receive_WM_COPYDATA") ;从其他脚本接收命令
msgbox,%CopyOfData%
return
Receive_WM_COPYDATA(wParam, lParam)
{
StringAddress := NumGet(lParam + 2*A_PtrSize)
CopyOfData := StrGet(StringAddress)
return true
}
-------------------------------------------
这样的话,你同时打开两个脚本时
按下F1,发送端就会把字符串传递到1.ahk里
此时再按F2,1.ahk就会显示传递过来的字符串


  • KnIfER
  • 小有美名
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我是修改窗口标题(加标签)实现传递小数据


  • KnIfER
  • 小有美名
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
postMessage 怎么做挺感兴趣的,我以前尝试从ahk发送到c++程序,传递字符串失败,只能传递数字。


  • 天唤风移
  • 小有美名
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
占用剪切板的问题很好解决,第一个取色脚本里加一个打断循环的语录就行了
if (GetKeyState("1","P") )
break


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 15回复贴,共1页
<<返回autohotkey吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示