2,586
社区成员
发帖
与我相关
我的任务
分享
def find_notify_icon(self,titleParam,hwnd):
'''
win32 is vi
:param titleParam:
:param hwnd:
:return:
'''
lpBuffer = LPVOID()
ipHandle = LPVOID()
lpdwProcessId = c_ulong()
nStrOffset = sizeof(TBBUTTON) - sizeof(INT_PTR)
hwndOffset = sizeof(INT_PTR)
if self.is_run_on_win64():
# 当前进程是32位进程,字节是以4字节对齐
# 在64位系统上,托盘图标区域隶属于explorer资源管理器进程,是64位进程,在该进程中
# TBBUTTON中的各字段的长度都变长了,所以要针对64位情况计算偏移(要考虑不同系统中
# 的字节对齐问题,TBBUTTON结构体在64位进程中是8字节对齐
nStrOffset += 4 # bReserved在win64下多出来的4字节
nStrOffset += 4 # DWORD_PTR在win64下多出来的4字节
hwndOffset += 4
baseWin32.GetWindowThreadProcessId(hwnd,byref(lpdwProcessId))
if lpdwProcessId == 0:return ipHandle
hProcess = baseWin32.OpenProcess(processAccessRights['PROCESS_ALL_ACCESS']|processAccessRights['PROCESS_VM_OPERATION']|processAccessRights['PROCESS_VM_READ']|processAccessRights['PROCESS_VM_WRITE'],
False,
lpdwProcessId.value
)
lpAddress = baseWin32.VirtualAllocEx(hProcess,0,4096,memoryAllocation['MEM_COMMIT'],memoryProtectionConstants['PAGE_EXECUTE_READWRITE'])
countButton = baseWin32.SendMessage(hwnd,TB_BUTTONCOUNT,0,0)
for each in range(countButton):
tbbutton = TBBUTTON()
trydata = TRAYDATA()
baseWin32.SendMessage(hwnd,TB_GETBUTTON,each,LPARAM(lpAddress))
#读文本地址
baseWin32.ReadProcessMemory(hProcess,LPCVOID(lpAddress + nStrOffset),byref(lpBuffer),sizeof(lpBuffer),None)
if lpBuffer != -1:
buff = (1024*LPVOID)()
#读文本
baseWin32.ReadProcessMemory(hProcess,lpBuffer,buff,1024,None)
#buff为unicode,转换成字符串:title
title = wstring_at(buff)
print 'title:%s' %title
nullindex = title.find('\0')
if nullindex >0:
title = title[0:nullindex]
if title == titleParam:
ipHandleAdr = LPVOID(0)
szTips = (TCHAR*1024)()
#读句柄地址
baseWin32.ReadProcessMemory(hProcess,LPVOID(int(lpAddress)+40),byref(ipHandleAdr),sizeof(ipHandleAdr),None)
# print ipHandleAdr
baseWin32.ReadProcessMemory(hProcess,ipHandleAdr,byref(ipHandle),sizeof(ipHandle),None)
print 'ipHandle:%r' %trydata.uID
print 'ipHandle1:%r' %trydata.szExePath
print 'ipHandle2:%r' %trydata.hWnd
print 'ipHandle3:%r' %tbbutton.dwData
print 'ipHandle4:%r' %ipHandle.value
break
baseWin32.VirtualFreeEx(hProcess,lpAddress,4096,memoryFreeType['MEM_RELEASE'])
baseWin32.CloseHandle(hProcess)
return ipHandle.value