我正在使用pyHook,pythoncom和Pywin32模块,用Python制作一个小型键盘记录器.这是我的代码:
import pyHook, pythoncom, sys, logging
file_log = 'C:\\important\\log.txt'
def OnKeyboardEvent (event):
logging.basicConfig(filename=file_log, level=logging.DEBUG, format='%(message)s')
chr(event.Ascii)
logging.log(10, chr(Event.Ascii))
return True
hooks_manager=pyHook.HookManager()
hooks_manager.KeyDown = OnKeyboardEvent
hooks_manager.HookKeyboard()
pythoncom.PumpMessages()
Run Code Online (Sandbox Code Playgroud)
运行时,它会返回以下错误消息:
File "C:\Python27\lib\site-packages\pythoncom.py", line 2, in <module>
import pywintypes
ImportError: No module named pywintypes
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?
我写了这段代码来观察keydown动作的事件.问题似乎是,当运行此脚本时,某些程序将使此程序崩溃,并吐出此错误消息:
TypeError: KeyboardSwitch() missing 8 required positional arguments: 'msg', 'vk_
code', 'scan_code', 'ascii', 'flags', 'time', 'hwnd', and 'win_name'
Run Code Online (Sandbox Code Playgroud)
一些被发现崩溃的程序是:Skype,Sublime Text 2
在调试它的几次试验之后,问题似乎发生在最后一行,但我似乎无法缩小范围.我也不明白编译器返回的KeyboardSwitch()的含义......
我还发现程序会交替返回此错误消息
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\pyHook\HookManager.py", line 351, in KeyboardSwitch
return func(event)
File "observe.py", line 6, in OnKeyboardEvent
print ('MessageName:',event.MessageName)
TypeError: an integer is required (got type NoneType)
Run Code Online (Sandbox Code Playgroud)
原因是什么以及如何解决这个问题,特别是因为它只出现在按下的两个键中
import pyHook, pythoncom
def OnKeyboardEvent(event):
# Source: http://code.activestate.com/recipes/553270-using-pyhook-to-block-windows-keys/
print ('MessageName:',event.MessageName)
print ('Message:',event.Message)
print ('Time:',event.Time)
print ('Window:',event.Window)
print ('WindowName:',event.WindowName)
print ('Ascii:', event.Ascii, chr(event.Ascii))
print ('Key:', event.Key)
print ('KeyID:', …Run Code Online (Sandbox Code Playgroud) 首先,我想说如果有人可以在这里提供帮助,您真是不可思议。
一般问题
我的Python程序需要与MSMQ进行交互。基本上,我想窥视一个队列,如果队列中没有任何内容,则指定一个超时。
但是,尽管我已尽力而为,但当队列中先前没有任何值时,我无法让Peek()等待超时间隔。 您能否指出此代码中缺少的内容?
我当前的代码
现在是我的代码:
from socket import gethostname
import win32com.client
import pythoncom
import clr
clr.AddReference("System")
clr.AddReference("System.Messaging")
from System import TimeSpan
from System.Messaging import MessageQueue
# Source: [1]
# [1] https://docs.microsoft.com/en-us/previous-versions/windows/desktop/msmq/ms707027%28v%3dvs.85%29
MQ_DENY_NONE = 0x0
MQ_PEEK_ACCESS = 0x1
MQ_SEND_ACCESS = 0x2
# Set up queue
pythoncom.CoInitialize()
qinfo = win32com.client.Dispatch("MSMQ.MSMQQueueInfo")
qinfo.FormatName = f"direct=os:{gethostname()}\\PRIVATE$\\MyQueue"
queue = qinfo.Open(MQ_PEEK_ACCESS, MQ_DENY_NONE)
# Receive a value
timeout_sec = 1.0
timespan = TimeSpan.FromSeconds(timeout_sec)
label, body = "", ""
# TODO: timeout value does not appear working. …Run Code Online (Sandbox Code Playgroud) 我很惊讶地看到没有很多关于函数pythoncom.PumpMessages()或pythoncom模块的解释文档。
那么做什么pythoncom.PumpMessages()和pythoncom.PumpWaitingMessages()做什么以及如何做?我真正了解它用于从输入设备捕获事件。
import sys
import win32api, win32con
import pyHook
import pythoncom
def CursorLeft():
win32api.mouse_event(win32con.MOUSEEVENTF_MOVE, -1, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)
def Quit():
print "Quitting"
sys.exit()
# create a keyboard hook
def OnKeyboardEvent(event):
print 'MessageName:', event.MessageName
print 'Key:', event.Key
if event.Key in ['Numpad2']:
CursorLeft()
elif event.Key in ['End']:
Quit()
return True
def OnMouseEvent(event):
print 'Position:', event.Position
return True
hm = pyHook.HookManager()
hm.MouseAll = OnMouseEvent
hm.HookMouse()
hm.KeyDown = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()
Run Code Online (Sandbox Code Playgroud)
函数 CursorLeft 每隔一段时间都可以正常工作。如果没有任何负数作为参数,它也能正常工作。我完全不知道为什么会这样!
第一次打电话,很好。
第二个电话,
类型错误:需要一个整数
第三次电话,好的。
第四次通话,
类型错误:需要一个整数。
等等等等。
是否可以从excel文件中获取表格并将其粘贴到保存其excel样式的word文档中?我没有找到有关 win32com 及其所有方法的足够文档。
我找到了一个方法PasteExcelTable,我想我应该在调用这个方法之前从 excel 中选择表格。我执行以下操作:
from win32com import client
excel = client.Dispatch("Excel.Application")
word = client.Dispatch("Word.Application")
doc = word.Documents.Open("C:/word_file.docx")
book = excel.Workbooks.Open("C:/excel_file.xlsx")
sheet = book.Worksheets(1)
sheet.Range("A1:D20").Select # Selected the table I need to copy
doc.Content.PasteExcelTable(False, False, False)
Run Code Online (Sandbox Code Playgroud)
然后它失败了。我什至不知道我是否走对了方向。
我用这个打了一堵墙.我需要创建一个基于python的com服务器,将其打包为windows exe并将其部署在Windows上.它必须具有"完整"接口 - 因为消费者需要idispatch和特定的interfce才能运行.现在我已经创建了com服务器并让它在解释器下运行,并且它与我挑剔的客户端完美地运行.但是,当打包为EXE时 - 它是一个本地服务器 - 当系统尝试实例化时,我在日志中出现错误(即使是从vbs脚本).所以这里的每一个.我在itnernet中搜索高低,它看起来像一个导入问题,但我不知道如何导入我自己的python对象供本地服务器使用.
这是安装了pywin32扩展的python 2.7.
首先 - 我为服务器创建的IDL:
imtg.idl
// This file will be processed by the MIDL tool to
// produce the type library (imtg.tlb) and marshalling code.
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(4fafbb23-6a38-4613-b93b-68ea66c67043),
dual,
helpstring("IImtGroupApp Interface"),
pointer_default(unique)
]
interface IImtGroupApp : IDispatch
{
[id(1), helpstring("method EchoString")] HRESULT EchoString([in] BSTR in1, [out, retval] BSTR *vals);
[id(2), helpstring("method AddNumbers")] HRESULT AddNumbers([in] long in1, [in] long in2, [out, retval] long *vali);
};
[
uuid(d665e9d0-71a9-4e23-a1b4-abe3376d5c58),
version(1.0), …Run Code Online (Sandbox Code Playgroud) 第一次用outlook发邮件,就成功了。然后,在第二次循环迭代中,它失败了
import threading
import pythoncom # to lauch mails in threads
import win32com.client as win32 # pip install pywin32, pip install pypiwin32
from datetime import datetime, timedelta
import psutil
import time
def is_outlook_app_open():
for proc in psutil.process_iter():
try:
if(proc.name() == "OUTLOOK.EXE"):
return True
except NoSuchProcess:
pass
return False
def send_status_email(outlook_id):
'''
status email: that the script works
'''
recipients = [
'someone@gmail.com',
]
was_open = is_outlook_app_open()
# Initialize
pythoncom.CoInitialize()
# Get instance from the id
outlook = win32.Dispatch(pythoncom.CoGetInterfaceAndReleaseStream(
outlook_id, pythoncom.IID_IDispatch) …Run Code Online (Sandbox Code Playgroud) 我希望有人可以帮助我从 Python 对 Excel 进行编组的跨进程调用。
我有一个通过 Python 启动的 Excel 会话,我知道它会在需要从单独的 Python 进程访问时启动并运行。我使用编组CoMarshalInterfaceInStream()和CoGetInterfaceAndReleaseStream()来自 pythoncom 模块的调用使一切正常工作,但我需要重复访问流(在我的情况下我只能设置一次),并且CoGetInterfaceAndReleaseStream()只允许一次访问接口。
我相信,我想实现是可以做到的是什么CreateStreamOnHGlobal(),CoMarshalInterface()而CoUnmarshalInterface()但我无法得到它的工作,几乎可以肯定,因为我不是在正确的参数传递。
我没有详细描述我的主要场景,而是设置了一个简单的示例程序,如下所示 - 显然这发生在同一过程中,但一次一个步骤!以下代码段工作正常:
import win32com.client
import pythoncom
excelApp = win32com.client.DispatchEx("Excel.Application")
marshalledExcelApp = pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, excelApp)
xlApp = win32com.client.Dispatch(
pythoncom.CoGetInterfaceAndReleaseStream(marshalledExcelApp, pythoncom.IID_IDispatch))
xlWb = xlApp.Workbooks.Add()
xlWs = xlWb.Worksheets.Add()
xlWs.Range("A1").Value = "AAA"
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试以下操作时:
import win32com.client
import pythoncom
excelApp = win32com.client.DispatchEx("Excel.Application")
myStream = pythoncom.CreateStreamOnHGlobal()
pythoncom.CoMarshalInterface(myStream,
pythoncom.IID_IDispatch,
excelApp,
pythoncom.MSHCTX_LOCAL,
pythoncom.MSHLFLAGS_TABLESTRONG)
myUnmarshaledInterface = pythoncom.CoUnmarshalInterface(myStream, pythoncom.IID_IDispatch)
Run Code Online (Sandbox Code Playgroud)
调用时出现此错误(我认为与第三个参数有关)pythoncom.CoMarshalInterface():
"ValueError: argument …Run Code Online (Sandbox Code Playgroud) 我正在使用Python 3.2.2,并构建Tkinter接口来进行一些Active Directory更新。我在尝试处理pythoncom.com_error异常时遇到麻烦。
我从这里获取了一些代码:http : //code.activestate.com/recipes/303345-create-an-account-in-ms-active-directory/
但是,我使用以下(直接来自上述站点)处理所引发的异常:
except pythoncom.com_error,(hr,msg,exc,arg):
Run Code Online (Sandbox Code Playgroud)
该代码与我所见过的处理这些异常的许多站点一致,但是对于Python 3.2.2,如果在“ pythoncom.com_error”之后加上逗号,则会出现语法错误。如果删除逗号,程序将启动,但是当引发异常时,我会收到其他异常,因为“ hr”,“ msg”等未定义为全局变量。
如果我删除逗号和方括号中的所有位,那么一切正常,除了我无法确切看到异常情况(我想要的)之外,这样我就可以通过AD传递实际的错误消息。
有谁知道如何在Python 3.2.2中正确处理这些pythoncom异常?
提前致谢!
我正在编写一个关于pyHook的键盘记录代码.以下代码是示例:
import pythoncom as pc, pyHook as ph
def KeyboardHook(event):
print chr(event.Ascii)
return True
hm = ph.HookManager()
hm.KeyDown = KeyboardHook
hm.HookKeyboard()
pc.PumpMessages()
Run Code Online (Sandbox Code Playgroud)
我想稍后停止pythoncom的PumpMessages方法(例如5秒).但我找不到任何答案.
我用的是:Windows 7,Python2.7
谢谢你的回答.
pythoncom.PumpMessages()
根据我的理解,这条线基本上告诉程序永远等待.为了我的目的,它似乎工作.但是,我希望能够在给定正确刺激的情况下结束该计划.如何结束上述行,或停止程序进一步运行.
我想检查特定的发件人电子邮件,并在到达目的地时自动进行处理
但是,在某些情况下,我的Outlook可能会重新启动,这意味着我收到了发件人的邮件并标记为未读
为了连续监视特定主题的新邮件,我找到了以下代码
import win32com.client
import pythoncom
import re
class Handler_Class(object):
def OnNewMailEx(self, receivedItemsIDs):
# RecrivedItemIDs is a collection of mail IDs separated by a ",".
# You know, sometimes more than 1 mail is received at the same moment.
for ID in receivedItemsIDs.split(","):
mail = outlook.Session.GetItemFromID(ID)
subject = mail.Subject
print subject
try:
command = re.search(r"%(.*?)%", subject).group(1)
print command # Or whatever code you wish to execute.
except:
pass
outlook = win32com.client.DispatchWithEvents("Outlook.Application",Handler_Class)
#and then an infinit loop that waits from …Run Code Online (Sandbox Code Playgroud) pythoncom ×13
python ×12
pyhook ×4
win32com ×4
excel ×2
message-pump ×2
python-2.7 ×2
python-3.x ×2
pywin32 ×2
com ×1
exception ×1
exit ×1
keylogger ×1
marshalling ×1
ms-word ×1
msmq ×1
msmq-wcf ×1
py2exe ×1
winapi ×1