[已解决]后台监视剪贴板并通过快捷键写入文档
本帖最后由 地平线 于 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 http://www.autoitx.com/images/common/back.gif
while true
sleep(100)
wend
回复 2# veket_linux
veket_linux 发表于 2012-3-28 11:54 http://www.autoitx.com/images/common/back.gif
请问能解释一下吗?不太明白。 给你个参考http://www.autoitx.com/forum.php?mod=viewthread&tid=30072&highlight=QQ 本帖最后由 卫和谐 于 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
卫和谐 发表于 2012-3-28 12:39 http://www.autoitx.com/images/common/back.gif
While 1
下一句应该添加上 Clip()
不然哪能动态监测到剪贴板的值? 本帖最后由 蜘蛛抱蛋 于 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这个是用第一行作为文件名保存在单独的文件里
如果保存在一个文档里就直接第一行代码解决问题 给你一个我自己用的仅做参考:#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 回复 5# 卫和谐
谢谢你提供的思路,达到了预想的功能。但循环语句后台占用的系统资源很大,主要是CPU占用50%,不知道有没有其他方法呢?例如捕获系统消息等。 回复 8# jixiren001
非常感谢jixiren001提供的实例,查了好久帮助文件终于看懂了,在实例里学习了很多方法。{:face (88):} #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
回复 9# 地平线
在WHILE 里加个SLEEP试试! 回复 7# 蜘蛛抱蛋
请问AHK是什么?代码中 ^space:: 又是什么意思? 回复 12# 卫和谐
果然,加上SLEEP后一切恢复正常状态。这是什么原因呢?不明白。 手下了!!留着以后扩展思路
页:
[1]
2