如何解决如何确定Enter输入触发了哪个按钮,或者如何确定窗口中的默认按钮
我正在使用Python(PyHook3软件包)编写一个插件,该插件可以识别某些消息框(使用Delphi Application.MessageBox实现)并确定操作员的操作,主要是确定单击了哪些键。识别鼠标和键盘输入。现在,当我单击鼠标按钮时,我可以识别按钮的手柄,但是当我按下Enter键时,只能识别对话框窗口的手柄(输入无法识别特定的按钮)。这些Windows具有不同的默认按钮。我不知道哪个是默认按钮。
1)我同时使用了“ win32gui.peekMessage”和“ win32gui.PeekMessage”来尝试拦截消息,但是没有用。
2)我已经使用了win32gui.WindowFromPoint(win32gui.GetCursorPos()),但是没有用。
我想知道如何确定Enter输入触发了哪个按钮,或者如何确定窗口中的默认按钮。
期待得到您的答案!非常感谢!
像这样的消息框(对话框)的Delphi代码 (它实际上是一个普通的Windows消息框,但是具有不同的默认按钮,并且可以用其他语言实现):
Application.MessageBox('The file already exists. Overwrite it?','Hint',MB_YESNO)
Application.MessageBox('The file already exists. Overwrite it?',MB_YESNO + MB_ICONQUESTION)
Application.MessageBox('The file already exists. Overwrite it?',MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2)
消息框如下所示:
部分代码如下:
# -*- coding: utf-8 -*- #
#Python version:3.5.4
# #
from win32 import win32process
import time
import threading
#import win32
import psutil
import PyHook3 as pyHook
import pythoncom
import win32gui,win32ui,win32con,win32api
import datetime as dt
Operator = ""
TAPID = 0
TopWindowHWND=0
TopFormName = ""
TopWindowPID = 0
MainThreadID = 0
LastHintHWND = 0
HintText = ""
state = 0
def OnMouseEvent(event):
# if LastHintHWND==0:
# return True
EventHWND = event.Window
EventTime = dt.datetime.Now().strftime('%Y%m%d%H%M%s%f')[0:17]#event.Time
print("MouseEvent="+win32gui.GetwindowText(EventHWND),"EventTime = ",EventTime)
EventwindowName=event.WindowName
if event.Message==513:
print('Time:',event.Time)
if event.WindowName != None:
Operate=event.MessageName + event.WindowName+"\n"
else:
Operate=event.MessageName + "\n"
print(EventHWND,EventTime,Operate)
return True
def OnKeyboardEvent(event):
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:',event.KeyID)
print('ScanCode:',event.ScanCode)
print('Extended:',event.Extended)
print('Injected:',event.Injected)
print('Alt',event.Alt)
print('Transition',event.Transition)
if str(event.Key)=='F12':
win32api.PostQuitMessage(0)
return True
def GetProcessIdByHWND(HWND):
thread_id = 0
process_id = 0
app = ""
if HWND!=0:
app = win32gui.GetwindowText(HWND)
thread_id,process_id = win32process.GetwindowThreadProcessId(HWND)
process = psutil.Process(process_id)
else:
pass
return app,process_id
def WindowTraversal():
global TAPID,state,LastHintHWND,HintText
TAFormName = ""
while 1:
#TfrmMain is the fram class of program
TopMianFormHWND = win32gui.FindWindow('TfrmMain',None)
TopMianForm,TAPID = GetProcessIdByHWND(TopMianFormHWND)
if TopMianForm.find("日操作流程")>=0:
#do something
pass
time.sleep(1)
if __name__ == '__main__':
print('start capture...')
MainThreadID=threading.currentThread().ident
try:
ThreadWT = threading.Thread(target=WindowTraversal,name='ThreadWT',args=())
ThreadWT.setDaemon(True)
# threads.append(ThreadWT)
ThreadWT.start()
except:
print("Error:--")
hm = pyHook.HookManager()
hm.MouseAllButtons = OnMouseEvent
hm.HookMouse()
hm.KeyAll = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages(10000)
while 1:
open_str = input("whether restart(anykey): \n")
if state == 2 or open_str=='1':
pythoncom.PumpMessages(10000)
pass
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。