Jac*_*001 6 python wm-copydata python-3.3
我正在尝试编写一个 python 脚本来与我的Stickies副本交互。我在 Python 如何与 WM_COPYDATA 结构交互方面遇到了麻烦,不幸的是我无法在网上找到很多示例。
使用代码:
import struct
import win32con
import win32gui
import struct, array
int_buffer = array.array("L", [0])
char_buffer = array.array('b', 'do new sticky')
int_buffer_address = int_buffer.buffer_info()[0]
char_buffer_address, char_buffer_size = char_buffer.buffer_info
copy_struct = struct.pack("pLp",
int_buffer_address,
char_buffer_size, char_buffer_address)
hwnd = win32gui.FindWindow("ZhornSoftwareStickiesMain", None)
win32gui.SendMessage(w, WM_COPYDATA, hwnd, copy_struct)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
C:\Users\%userprofile%\Desktop>python sender.py
Traceback (most recent call last):
File "sender.py", line 7, in <module>
char_buffer = array.array('b', 'do new sticky')
TypeError: an integer is required
Run Code Online (Sandbox Code Playgroud)
我似乎无法弄清楚为什么我会收到这样的错误。有任何想法吗?
编辑:一些部分工作的代码
import struct
import win32con
import win32gui
import struct, array
int_buffer = array.array("L", [0])
char_buffer = array.array('b', b"do manage open")
int_buffer_address = int_buffer.buffer_info()[0]
# Add () to buffer_info to call it.
char_buffer_address, char_buffer_size = char_buffer.buffer_info()
# Need P type for the addresses.
copy_struct = struct.pack("PLP",int_buffer_address,char_buffer_size, char_buffer_address)
hwnd = win32gui.FindWindow(None, "ZhornSoftwareStickiesMain")
win32gui.SendMessage(hwnd, win32con.WM_COPYDATA, None, copy_struct)
Run Code Online (Sandbox Code Playgroud)
在 Python 3 中,字符串是 Unicode。尝试使用字节字符串:
>>> import array
>>> array.array('b',b'do new sticky')
array('b', [100, 111, 32, 110, 101, 119, 32, 115, 116, 105, 99, 107, 121])
Run Code Online (Sandbox Code Playgroud)
还有一些其他变化:
import struct, array
int_buffer = array.array("L", [0])
char_buffer = array.array('b', b'do new sticky')
int_buffer_address = int_buffer.buffer_info()[0]
# Add () to buffer_info to call it.
char_buffer_address, char_buffer_size = char_buffer.buffer_info()
# Need P type for the addresses.
copy_struct = struct.pack("PLP",int_buffer_address,char_buffer_size, char_buffer_address)
Run Code Online (Sandbox Code Playgroud)
我没有安装该软件,但我认为下一行应该是:
hwnd = win32gui.FindWindow(None, "ZhornSoftwareStickiesMain")
win32gui.SendMessage(hwnd, win32con.WM_COPYDATA, None, copy_struct)
Run Code Online (Sandbox Code Playgroud)
我安装了该软件。最初我无法让任何命令起作用,但 API 文档中不清楚的技巧是每个字符串必须以api:
import struct
import win32con
import win32gui
import array
char_buffer = array.array('B', b'api do new sticky hello, world')
char_buffer_address, char_buffer_size = char_buffer.buffer_info()
copy_struct = struct.pack("PLP", 12345, char_buffer_size, char_buffer_address)
hwnd = win32gui.FindWindow(None, "ZhornSoftwareStickiesMain")
win32gui.SendMessage(hwnd, win32con.WM_COPYDATA, None, copy_struct)
Run Code Online (Sandbox Code Playgroud)

使用 ctypes 可以更容易地做到这一点。此代码已使用简单的 Delphi 应用程序进行了测试,该应用程序接收并显示通过 发送的字符串WM_COPYDATA。
import win32con
import ctypes
import ctypes.wintypes
FindWindow = ctypes.windll.user32.FindWindowW
SendMessage = ctypes.windll.user32.SendMessageW
class COPYDATASTRUCT(ctypes.Structure):
_fields_ = [
('dwData', ctypes.wintypes.LPARAM),
('cbData', ctypes.wintypes.DWORD),
('lpData', ctypes.c_wchar_p)
#formally lpData is c_void_p, but we do it this way for convenience
]
hwnd = FindWindow('TheNameOfMyWindowClass', None)
cds = COPYDATASTRUCT()
cds.dwData = 0
str = 'boo'
cds.cbData = ctypes.sizeof(ctypes.create_unicode_buffer(str))
cds.lpData = ctypes.c_wchar_p(str)
SendMessage(hwnd, win32con.WM_COPYDATA, 0, ctypes.byref(cds))
Run Code Online (Sandbox Code Playgroud)
这假设接收者期望 UTF-16 编码的有效负载。如果接收者期望 ANSI 编码的有效负载,那么您需要使用此变体。
import win32con
import ctypes
import ctypes.wintypes
FindWindow = ctypes.windll.user32.FindWindowW
SendMessage = ctypes.windll.user32.SendMessageW
class COPYDATASTRUCT(ctypes.Structure):
_fields_ = [
('dwData', ctypes.wintypes.LPARAM),
('cbData', ctypes.wintypes.DWORD),
('lpData', ctypes.c_char_p)
#formally lpData is c_void_p, but we do it this way for convenience
]
hwnd = FindWindow('TheNameOfMyWindowClass', None)
cds = COPYDATASTRUCT()
cds.dwData = 0
str = b'boo'
cds.cbData = ctypes.sizeof(ctypes.create_string_buffer(str))
cds.lpData = ctypes.c_char_p(str)
SendMessage(hwnd, win32con.WM_COPYDATA, 0, ctypes.byref(cds))
Run Code Online (Sandbox Code Playgroud)
现在,查看您发布的 Stickies 链接,您需要使用 ANSI 变体。如果您想接收通知,则需要在 SendMessage 调用中传递一个窗口句柄,而不是上面的 0。
| 归档时间: |
|
| 查看次数: |
4669 次 |
| 最近记录: |