找回密码
 加入
搜索
查看: 10006|回复: 15

[AU3基础] [已解决]后台监视剪贴板并通过快捷键写入文档

 火.. [复制链接]
发表于 2012-3-28 11:48:01 | 显示全部楼层 |阅读模式
本帖最后由 地平线 于 2012-3-28 17:46 编辑

经常要复制网页上的内容(主要是文字),如果不停地打开文档粘帖很麻烦。所以想写个代码,运行后在后台持续安静地监视剪贴板,当按下CTRL+C复制时,把剪贴板的内容写入到文档中;等到下一次按下CTRL+C复制时,在文件尾追加新的剪贴板内容。
我自己写了这段,但运行后就马上退出了,并没有等待我按下CTRL+C。我看了下代码确实不对劲,但不知道怎么让它在后台等待热键并响应。求高手指点!
PS:本来想设置热键为“^c”的,但发现CTRL和组合键不能设置,只好改为F8。
HotKeySet("{ESC}","quit")
HotKeySet("{F8}","Clip")
$file = FileOpen("temp.txt",1)
If $file = -1 Then
    MsgBox(0, "错误", "不能打开文件.")
    Exit
EndIf
FileOpen("temp.txt",1)

Func Clip()
        Sleep(500)
        $bak = ClipGet()
        FileWrite($file, $bak & @CRLF)
EndFunc

Func quit()
        Exit
EndFunc
感谢各位前辈的帮助,特别是#8的jixiren001提供的方法,所有预想功能实现,而且系统资源占用率也不高。
给你一个我自己用的仅做参考:
jixiren001 发表于 2012-3-28 14:08
发表于 2012-3-28 11:54:55 | 显示全部楼层

while true
    sleep(100)
wend
 楼主| 发表于 2012-3-28 12:19:15 | 显示全部楼层
回复 2# veket_linux
veket_linux 发表于 2012-3-28 11:54

请问能解释一下吗?不太明白。
发表于 2012-3-28 12:22:51 | 显示全部楼层
发表于 2012-3-28 12:39:19 | 显示全部楼层
本帖最后由 卫和谐 于 2012-3-28 12:43 编辑
HotKeySet("{ESC}", "quit")
HotKeySet("{F8}", "Clip")

Global $bak=""

$file = FileOpen("temp.txt", 1)
If $file = -1 Then
        MsgBox(0, "错误", "不能打开文件.")
        Exit
EndIf

While 1
        If $bak <> "" Then
                FileWrite($file, $bak & @CRLF)
                $bak = ""
        EndIf        
WEnd

Func quit()
        Exit
EndFunc   ;==>quit

Func Clip()
        Sleep(500)
        $bak = ClipGet()
        ; FileWrite($file, $bak & @CRLF)
EndFunc   ;==>Clip

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2012-3-28 13:00:51 | 显示全部楼层
卫和谐 发表于 2012-3-28 12:39


While 1
下一句应该添加上 Clip()
   不然哪能动态监测到剪贴板的值?
发表于 2012-3-28 13:04:02 | 显示全部楼层
本帖最后由 蜘蛛抱蛋 于 2012-3-28 13:07 编辑

快捷键还是AHK来的方便~
^space::
FileAppend, %Clipboard%, D:\\tmp_fox.txt
FileReadLine, OutputVar, D:\\tmp_fox.txt, 1
FileMove,  c:\\tmp_fox.txt , D:\\%Outputvar%.txt
return
这个是用第一行作为文件名保存在单独的文件里
如果保存在一个文档里就直接第一行代码解决问题
发表于 2012-3-28 14:08:38 | 显示全部楼层
给你一个我自己用的仅做参考:
#PRE_icon=C:\WINDOWS\system32\SHELL32.dll|-66 ;图标
#PRE_Outfile=ClipText2File.exe                ;输出文件名
#PRE_Compression=4                            ;UPX压缩

;托盘无默认菜单
Opt('TrayMenuMode',1)         

;热键
HotKeySet('{F7}' ,'_StateSwitch'   )
HotKeySet('{F8}' ,'_ClipText2File' )
HotKeySet('{F9}' ,'_OpenRecordFile')
HotKeySet('{ESC}','_Exit'          )

;变量
Local $ToolName       = 'ClipText2File'
Local $RecordFilePath = @ScriptDir&'\Temp.txt'
Local $MonitorState   = 1

;托盘
Local $ClipItem  = TrayCreateItem('剪贴板文本写入')
Local $StateItem = TrayCreateItem('暂停监控剪贴板')
Local $OpenItem  = TrayCreateItem('打开记录用文件')
Local $ExitItem  = TrayCreateItem('退出')
TraySetIcon(@SystemDir&'\shell32.dll',66)
TraySetToolTip($ToolName&'运行中...')
TraySetState()

;主循环
While 1
        Local $TrayMsg =TrayGetMsg()
        Switch $TrayMsg
                Case $ClipItem
                        _ClipText2File()
                Case $StateItem
                        _StateSwitch()
                Case $OpenItem
                        _OpenRecordFile()
                Case $ExitItem
                        _Exit()
        EndSwitch
Wend

;自定义函数
Func _ClipText2File() ;获取剪贴板文本追加写入记录用文件
        Local $sText,$sFileHwnd
        If $MonitorState=1 Then
                $sText=ClipGet()
                If Not @error Then
                        $sFileHwnd=FileOpen($RecordFilePath,1+8);追加
                        If $sFileHwnd<>-1 Then
                                FileWrite($sFileHwnd,$sText & @CRLF)
                                TrayTip('提示','"'&StringLeft($sText,10)&'..."写入成功!',1)
                        Else
                                TrayTip('出错啦','"'&$RecordFilePath&'"打开失败!',1)
                        EndIf
                        FileClose($sFileHwnd)
                EndIf
        EndIf
EndFunc ;==>_ClipText2File
Func _StateSwitch();状态切换
        If $MonitorState=1    Then
                $MonitorState=0
                TrayItemSetState($ClipItem,128)
                TrayItemSetText($StateItem,'继续监控剪贴板')
                TraySetToolTip($ToolName&'暂停中...')
                TrayTip('提示','剪贴板监控功能已关闭',1)
        ElseIf $MonitorState=0 Then
                $MonitorState=1
                TrayItemSetState($ClipItem,64)
                TrayItemSetText($StateItem,'暂停监控剪贴板')
                TraySetToolTip($ToolName&'运行中...')
                TrayTip('提示','剪贴板监控功能已开启',1)
        EndIf
EndFunc ;==>_StateSwitch
Func _OpenRecordFile() ;打开记录用文件
        If Not FileExists($RecordFilePath) Then FileClose(FileOpen($RecordFilePath,1+8))
        ShellExecute($RecordFilePath,'', @ScriptDir, 'edit')
EndFunc ;==>_OpenRecordFile
Func _Exit() ;退出
        Exit
EndFunc ;==>_Exit

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2012-3-28 16:49:01 | 显示全部楼层
回复 5# 卫和谐
谢谢你提供的思路,达到了预想的功能。但循环语句后台占用的系统资源很大,主要是CPU占用50%,不知道有没有其他方法呢?例如捕获系统消息等。
 楼主| 发表于 2012-3-28 16:54:29 | 显示全部楼层
回复 8# jixiren001
非常感谢jixiren001提供的实例,查了好久帮助文件终于看懂了,在实例里学习了很多方法。
发表于 2012-3-28 17:52:47 | 显示全部楼层
#include <GuiConstantsEx.au3>
#include <ClipBoard.au3>
#include <WindowsConstants.au3>
#include <SendMessage.au3>

;~ Opt('MustDeclareVars', 1)

Global $iMemo, $hNext = 0

Local $hGUI

$hGUI = GUICreate("Clipboard", 600, 400)
$iMemo = GUICtrlCreateEdit("", 2, 2, 596, 396, $WS_VSCROLL)
GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
GUISetState()

$hNext = _ClipBoard_SetViewer($hGUI)

GUIRegisterMsg($WM_CHANGECBCHAIN, "WM_CHANGECBCHAIN")
GUIRegisterMsg($WM_DRAWCLIPBOARD, "WM_DRAWCLIPBOARD")

MemoWrite("GUI handle ....: " & $hGUI)
MemoWrite("Viewer handle .: " & _ClipBoard_GetViewer())

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

_ClipBoard_ChangeChain($hGUI, $hNext)

Func MemoWrite($sMessage = "")
        GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc   ;==>MemoWrite

Func WM_CHANGECBCHAIN($hWnd, $iMsg, $iwParam, $ilParam)
        MemoWrite("***** $WM_CHANGECBCHAIN *****")
        If $iwParam = $hNext Then
                $hNext = $ilParam
        ElseIf $hNext <> 0 Then
                _SendMessage($hNext, $WM_CHANGECBCHAIN, $iwParam, $ilParam, 0, "hwnd", "hwnd")
        EndIf
EndFunc   ;==>WM_CHANGECBCHAIN

Func WM_DRAWCLIPBOARD($hWnd, $iMsg, $iwParam, $ilParam)
        MemoWrite(_ClipBoard_GetData())
        If $hNext <> 0 Then _SendMessage($hNext, $WM_DRAWCLIPBOARD, $iwParam, $ilParam)
EndFunc   ;==>WM_DRAWCLIPBOARD
发表于 2012-3-28 22:03:51 | 显示全部楼层
回复 9# 地平线


    在WHILE 里加个SLEEP试试!
 楼主| 发表于 2012-3-28 22:09:01 | 显示全部楼层
回复 7# 蜘蛛抱蛋
请问AHK是什么?代码中 ^space:: 又是什么意思?
 楼主| 发表于 2012-3-28 22:18:04 | 显示全部楼层
回复 12# 卫和谐
果然,加上SLEEP后一切恢复正常状态。这是什么原因呢?不明白。
发表于 2012-12-28 17:13:27 | 显示全部楼层
手下了!!留着以后扩展思路
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-25 03:09 , Processed in 0.100394 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表