def UnpackDEV_BROADCAST(lparam): # guard for 0 here, otherwise PyMakeBuffer will create a new buffer. if lparam == 0: return None hdr_size = struct.calcsize("iii") hdr_buf = win32gui.PyMakeBuffer(hdr_size, lparam) size, devtype, reserved = struct.unpack("iii", hdr_buf) rest = win32gui.PyMakeBuffer(size - hdr_size, lparam + hdr_size) extra = x = {} if devtype == win32con.DBT_DEVTYP_HANDLE: # 2 handles, a GUID, a LONG and possibly an array following... fmt = "PP16sl" x['handle'], x['hdevnotify'], guid_bytes, x['nameoffset'] = \ struct.unpack(fmt, rest[:struct.calcsize(fmt)]) x['eventguid'] = pywintypes.IID(guid_bytes, True) elif devtype == win32con.DBT_DEVTYP_DEVICEINTERFACE: # guid, null-terminated name x['classguid'] = pywintypes.IID(rest[:16], 1) name = rest[16:] if '\0' in name: name = name.split('\0', 1)[0] x['name'] = name elif devtype == win32con.DBT_DEVTYP_VOLUME: # int mask and flags x['unitmask'], x['flags'] = struct.unpack("II", rest[:struct.calcsize("II")]) else: raise NotImplementedError("unknown device type %d" % (devtype, )) return DEV_BROADCAST_INFO(devtype, **extra)
def getText(hwnd): if hwnd == 0: return 'hwnd is not used return 0' length = 10000 buf = gui.PyMakeBuffer(length) length2 = gui.SendMessage(hwnd, con.WM_GETTEXT, length, buf) + 1 buf = gui.PyMakeBuffer(length2) gui.SendMessage(hwnd, con.WM_GETTEXT, length2, buf) address, length = gui.PyGetBufferAddressAndLen(buf) text = gui.PyGetString(address, length) return text
def get_text_by_hwnd(hwnd, buffer_len=64, cast=None): """ 根据 hwnd 获取窗口中的字符串 :param hwnd: :param buffer_len: :param cast: 是否进行类型转换,默认None不进行转换,float, int 可以继续对应类型转换 :return: """ buffer = win32gui.PyMakeBuffer(buffer_len) # buffer = win32gui.PyGetMemory(*array.array('b',bytearray(buffer_len)).buffer_info()) length = win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, buffer_len, buffer) char_list_len = length * 2 if length * 2 < buffer_len else buffer_len # aaa = [chr(buf) for buf in buffer[:char_list_len] if buf != 0] char_list = [] for n_buf, a_byte in enumerate(buffer[:char_list_len]): if n_buf % 2 != 0: continue if a_byte == 0: break char_list.append(chr(a_byte)) # print(buf, chr(buf)) ret_str = ''.join(char_list) if cast is not None: if ret_str == '-': ret_data = np.nan else: ret_data = cast(ret_str) else: ret_data = ret_str return ret_data
def UpdateValue_FromControl(self): buf_size = 256 buf = win32gui.PyMakeBuffer(buf_size) nchars = win32gui.SendMessage(self.GetControl(), win32con.WM_GETTEXT, buf_size, buf) str_val = buf[:nchars] self.SetOptionValue(str_val)
def readMOHAA(): try: print("Looking for MOHAA.") # Find the MOH console window hwnd = win32gui.FindWindow("MOHTA WinConsole", None) win32gui.ShowWindow(hwnd, win32con.SW_SHOW) clearBtn = win32gui.FindWindowEx(hwnd, None, "Button", "clear") # Click the clear button win32gui.SendMessage(hwnd, win32con.WM_COMMAND, 1, clearBtn) #Set cmdline with serverinfo cmdline = win32gui.GetDlgItem(hwnd, 101) win32gui.SendMessage(cmdline, win32con.WM_SETTEXT, None, "clientinfo") win32gui.PostMessage(cmdline, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) #Get console info console = win32gui.GetDlgItem(hwnd, 100) buffer = win32gui.PyMakeBuffer(25555) length = win32gui.SendMessage(console, win32con.WM_GETTEXT, 25555, buffer) result = buffer[0:length * 2].tobytes().decode("UTF-16") time.sleep(2) # Click the clear button win32gui.SendMessage(hwnd, win32con.WM_COMMAND, 1, clearBtn) # split on newline splitted = result.splitlines() for index, value in enumerate(splitted): if "Server: " in value: print("Found server! " + value[8:]) return value[8:] except Exception as e: print("Error[MOHSH]: " + str(e))
def 窗口_取窗口文本内容(窗口句柄): bufSize = win32api.SendMessage(窗口句柄, win32con.WM_GETTEXTLENGTH, 0, 0) + 1 strBuf = win32gui.PyMakeBuffer(bufSize) length = win32gui.SendMessage(窗口句柄, win32con.WM_GETTEXT, bufSize, strBuf) address, length = win32gui.PyGetBufferAddressAndLen(strBuf) text = win32gui.PyGetString(address, length) return text[:-1]
def __get_text(self, hwnd): buf_size = 0 try: textlength = ctypes.c_long(0) hr = ctypes.windll.user32.SendMessageTimeoutA( hwnd, win32con.WM_GETTEXTLENGTH, 0, 0, 0, 200, ctypes.byref(textlength)) if hr == 0 or textlength.value < 0: return "" buf_size = textlength.value * 2 + 1 except win32gui.error: return "" if buf_size <= 0: return "" pybuffer = win32gui.PyMakeBuffer(buf_size) ret = win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, pybuffer) if ret: address, _ = win32gui.PyGetBufferAddressAndLen(pybuffer) text = win32gui.PyGetString(address, ret) return text return ""
def UnpackLVNOTIFY(lparam): format = "3i8i" buf = win32gui.PyMakeBuffer(struct.calcsize(format), lparam) hwndFrom, id, code, item, subitem, newstate, oldstate, \ changed, pt_x, pt_y, lparam = struct.unpack(format, buf) return hwndFrom, id, code, item, subitem, newstate, oldstate, \ changed, (pt_x, pt_y), lparam
def _getMultipleWindowValues(hwnd, getCountMessage, getValueMessage): '''A common pattern in the Win32 API is that in order to retrieve a series of values, you use one message to get a count of available items, and another to retrieve them. This internal utility function performs the common processing for this pattern. Arguments: hwnd Window handle for the window for which items should be retrieved. getCountMessage Item count message. getValueMessage Value retrieval message. Returns: Retrieved items.''' result = [] BUFFER_SIZE = 256 buf = win32gui.PyMakeBuffer(BUFFER_SIZE) valuecount = win32gui.SendMessage(hwnd, getCountMessage, 0, 0) for itemIndex in range(valuecount): buf_len = win32gui.SendMessage(hwnd, getValueMessage, itemIndex, buf) result.append( win32gui.PyGetString( win32gui.PyGetBufferAddressAndLen(buf)[0], buf_len)) return result
def contentExtractor(hwnd): for i in childHandle: bufferSize = 1 + win32gui.SendMessage(i, win32con.WM_GETTEXTLENGTH, 0, 0) buffer = win32gui.PyMakeBuffer(bufferSize) win32gui.SendMessage(i, win32con.WM_GETTEXT, bufferSize, buffer) if bufferSize > 500: agreement = (buffer[:bufferSize]) # Normalize import re from nltk.corpus import stopwords letters_only = re.sub("[^a-zA-Z0-9]", " ", agreement) words = letters_only.lower().split() stops = set(stopwords.words("english")) meaningful_words = [w for w in words if not w in stops] KK = (" ".join(meaningful_words)) # print the agreement to a file if not os.path.isdir(EULAdir): os.mkdir(EULAdir) if os.path.isfile(EULAdir + filename + '.txt'): print "duplicated names" MyFile = open(EULAdir + filename + '.txt', 'w') MyFile.write(KK) MyFile.close() EULAHandle.append(True) return True return False
def _insert_item_at(self, v, i, title = None): _tab_ctrl = self._win if not title: title = 'Page %d' % (i) lbuf = gui.PyMakeBuffer(len(title)+1) address,l = gui.PyGetBufferAddressAndLen(lbuf) gui.PySetMemory(address, title) _format = "iiiPiii" buf = struct.pack(_format, cc.TCIF_TEXT, # mask 0, # state 0, # state mask address, 0, #unused 0, #image i #data ) gui.SendMessage(_tab_ctrl.GetSafeHwnd(), cc.TCM_INSERTITEM, i, buf) self._resize_children(v)
def OnNotify(self, hwnd, msg, wparam, lparam): format = "PPiiiiiiiiP" buf = win32gui.PyMakeBuffer(struct.calcsize(format), lparam) hwndFrom, idFrom, code, iItem, iSubItem, uNewState, uOldState, uChanged, actionx, actiony, lParam \ = struct.unpack(format, buf) if code == commctrl.NM_DBLCLK: print "Double click on item", iItem + 1 return 1
def __GetText(cls, hwnd): length = cls.__SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, None, None) + 1 buf = win32gui.PyMakeBuffer(length) cls.__SendMessage(hwnd, win32con.WM_GETTEXT, length, buf) address, length = win32gui.PyGetBufferAddressAndLen(buf) text = win32gui.PyGetString(address, length - 1) return cls.__ConvertEncoding(text, False)
def get_dlg_txt(handle_): buf_size = win32gui.SendMessage(handle_, win32con.WM_GETTEXTLENGTH, 0, 0) + 1 # 要加上截尾的字节 str_buffer = win32gui.PyMakeBuffer(buf_size) # 生成buffer对象 win32api.SendMessage(handle_, win32con.WM_GETTEXT, buf_size, str_buffer) # 获取buffer address, length = win32gui.PyGetBufferAddressAndLen(str_buffer) return win32gui.PyGetString(address, length)
def get_message(hwnd): buf_size = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH) + 1 # 要加上截尾的字节 str_buffer = win32gui.PyMakeBuffer(buf_size) # 生成buffer对象 win32api.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, str_buffer) # 获取buffer # str_buffer = str(str_buffer[:-1]) # 转为字符串 address, length = win32gui.PyGetBufferAddressAndLen(str_buffer) text = win32gui.PyGetString(address, length) return text
def UnpackTVNOTIFY(lparam): format = "iiii40s40s" buf = win32gui.PyMakeBuffer(struct.calcsize(format), lparam) hwndFrom, id, code, action, buf_old, buf_new \ = struct.unpack(format, buf) item_old = UnpackTVItem(buf_old) item_new = UnpackTVItem(buf_new) return hwndFrom, id, code, action, item_old, item_new
def getno(): #查询句柄 #第一个参数为父窗口类名,不知道类名时取None,在不同的系统环境下,r12可能变化 #第二个参数为窗口标题名,不知道标题时取None,FindWindow函数不能模糊查找 hld = win32gui.FindWindow( "#32770", "ArturDents CrackMe #2") HwndEx=None rect=None if hld>0: try: while rect!=(51, 39): #获取hld子窗口内的控件句柄,类名为edit,该函数只能查收下一级子窗口内控件的句柄,查询孙子窗口的句柄需要进行嵌套查询 #参数1:父窗口句柄 #参数2:子窗口句柄,从该子窗口开始向后查找,如果取None,则全部遍历一次 #参数3:查找窗口的类名,不知道类名时取None #参数4:查找窗口的的标题,不知道类名时取None,FindWindowEx函数不能模糊查找 HwndEx=win32gui.FindWindowEx(hld,HwndEx,"Edit",None) print("控件句柄:",HwndEx) #获取该句柄对应控件的左上角和右下角的坐标,获取的坐标为屏幕坐标 rect = win32gui.GetWindowRect(HwndEx) #将屏幕坐标转换为相对于父窗口的坐标 rect=win32gui.ScreenToClient(hld,(rect[0],rect[1])) print("控件左上角在父窗口内的坐标:",rect) #获取该句柄对应控件的长度和高度 ck = win32gui.GetClientRect(HwndEx) print("控件的长度和高度:",ck) print("\n") # 向控件内写入文本,第三个参数不使用,取0 win32gui.SendMessage(HwndEx, win32con.WM_SETTEXT, 0, "hello world") # 向控件内写入回车 win32gui.PostMessage(HwndEx, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) win32gui.PostMessage(HwndEx, win32con.WM_KEYUP, win32con.VK_RETURN, 0) # 获取控件内文本的长度,要加上截尾的字节 buf_size = win32gui.SendMessage(HwndEx, win32con.WM_GETTEXTLENGTH, 0, 0) + 1 print(buf_size) # 生成buffer对象 str_buffer = win32gui.PyMakeBuffer(buf_size*2) # 获取buffer,得到类似于16进制的东西,将结果传输给str_buffer,参数3控制获取长度 win32api.SendMessage(HwndEx, win32con.WM_GETTEXT, buf_size, str_buffer) # 将buffer转为字符串 string = bytes(str_buffer).decode('utf-16') print("目标控件内的文本为:",string) except BaseException as e: print('错误信息:',e) else: print("错误!!程序未启动")
def get_msg(self, hwd_n): hwd_edit = self.found_hwnd(hwd_n) bufLen = 1024 buf = win32gui.PyMakeBuffer(bufLen) n = win32gui.SendMessage(hwd_edit, win32con.WM_GETTEXT, bufLen, buf) #print 'Get the message:',buf[0:n] return buf[0:n]
def getcont(HW): length = win32gui.SendMessage(HW, win32con.WM_GETTEXTLENGTH) + 1 buf = win32gui.PyMakeBuffer(length) # 发送获取文本请求 win32api.SendMessage(HW, win32con.WM_GETTEXT, length, buf) # 下面应该是将内存读取文本 address, length = win32gui.PyGetBufferAddressAndLen(buf[:-1]) text = win32gui.PyGetString(address, length) return text
def get_message(hwnd): buf_size = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH) + 1 # 要加上截尾的字节 str_buffer = win32gui.PyMakeBuffer(buf_size) # 生成buffer对象 kk = win32api.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, str_buffer) # 获取buffer print(kk) str_buffer = str(str_buffer[:-1]) # 转为字符串 return str_buffer
def GetWinValue(h_win): length = win32gui .SendMessage(h_win, win32con.WM_GETTEXTLENGTH) + 1 # print('Length: ', length) buf = win32gui.PyMakeBuffer(length) win32gui .SendMessage(h_win, win32con.WM_GETTEXT, length, buf) address, result_length = win32gui.PyGetBufferAddressAndLen(buf) text = win32gui.PyGetString(address, result_length) return text[:-1]
def getEditText(hwnd): bufLen = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) + 1 print(bufLen) buffer = win32gui.PyMakeBuffer(bufLen) win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, bufLen, buffer) print(buffer) text = str(buffer[:bufLen]) #str = str(buffer[:-1]) return text
def GetWindowText(handle, encoding='utf16'): if encoding: buf_size = 2 * win32gui.SendMessage(handle, win32con.WM_GETTEXTLENGTH, 0, 0) if buf_size: buffer = win32gui.PyMakeBuffer(buf_size) win32gui.SendMessage(handle, win32con.WM_GETTEXT, buf_size, buffer) text = bytes(buffer[0: buf_size]).decode(encoding, errors="ignore") text = re.sub('''[^\w!@#$%^&().]''', "", text) return text return win32gui.GetWindowText(handle)
def getBufferContent(hwnd): buf_size = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) # print('buf_size: ', buf_size) buf = win32gui.PyMakeBuffer(buf_size) win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, buf) # print('_buf_str: ', str(buf)) address, length = win32gui.PyGetBufferAddressAndLen(buf) text = win32gui.PyGetString(address, length) buf.release() return text
def 提取句柄文本(句柄): # 获取识别结果中输入框文本 length = win32gui.SendMessage(句柄, win32con.WM_GETTEXTLENGTH)+1 buf = win32gui.PyMakeBuffer(length) #发送获取文本请求 win32api.SendMessage(句柄, win32con.WM_GETTEXT, length, buf) #下面应该是将内存读取文本 address, length = win32gui.PyGetBufferAddressAndLen(buf[:-1]) text = win32gui.PyGetString(address, length) return text
def get_value3(self, hwnd): buf_size = 1 + win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) #print("buf_size ", buf_size) if buf_size: buffer = win32gui.PyMakeBuffer(buf_size) win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, buffer) txt = buffer[:buf_size-1] return txt
def UpdateValue_FromControl(self): buf_size = 100 buf = win32gui.PyMakeBuffer(buf_size) nchars = win32gui.SendMessage(self.GetControl(), win32con.WM_GETTEXT, buf_size, buf) str_val = buf[:nchars] val = float(str_val) if val < self.min_val or val > self.max_edit_val: raise ValueError, "Value must be between %d and %d" % ( self.min_val, self.max_val) self.SetOptionValue(val)
def OnHelp(self, hwnd, msg, wparam, lparam): format = "iiiiiii" buf = win32gui.PyMakeBuffer(struct.calcsize(format), lparam) cbSize, iContextType, iCtrlId, hItemHandle, dwContextID, x, y = \ struct.unpack(format, buf) tt_text = self.GetPopupHelpText(iCtrlId) if tt_text: self.tt.ShowTooltipForControl(iCtrlId, tt_text) else: self.tt.HideTooltip() return 1
def GetTextData(hwnd, ID): #传入父句柄,控件ID hwnd = win32gui.GetDlgItem(hwnd, ID) buf_size = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) + 1 # 要加上截尾的字节 str_buffer = win32gui.PyMakeBuffer(buf_size) # 生成buffer对象 win32api.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, str_buffer) # 获取buffer address, length = win32gui.PyGetBufferAddressAndLen(str_buffer) text = win32gui.PyGetString(address, length - 1) return text
def UnpackNMITEMACTIVATE(lparam): format = _nmhdr_fmt + _nmhdr_align_padding if is64bit: # the struct module doesn't handle this correctly as some of the items # are actually structs in structs, which get individually aligned. format = format + "iiiiiiixxxxP" else: format = format + "iiiiiiiP" buf = win32gui.PyMakeBuffer(struct.calcsize(format), lparam) return _MakeResult( "NMITEMACTIVATE hwndFrom idFrom code iItem iSubItem uNewState uOldState uChanged actionx actiony lParam", struct.unpack(format, buf))