如何确定Enter输入触发了哪个按钮,或者如何确定窗口中的默认按钮

如何解决如何确定Enter输入触发了哪个按钮,或者如何确定窗口中的默认按钮

我正在使用Python(PyHook3软件包)编写一个插件,该插件可以识别某些消息框(使用Delphi Application.MessageBox实现)并确定操作员的操作,主要是确定单击了哪些键。识别鼠标和键盘输入。现在,当我单击鼠标按钮时,我可以识别按钮的手柄,但是当我按下Enter键时,只能识别对话框窗口的手柄(输入无法识别特定的按​​钮)。这些Windows具有不同的认按钮。我不知道哪个是认按钮。

1)我同时使用了“ win32gui.peekMessage”和“ win32gui.PeekMessage”来尝试拦截消息,但是没有用。

2)我已经使用了win32gui.WindowFromPoint(win32gui.GetCursorPos()),但是没有用。

3)我还试图找到一种方法来验证认按钮,但不能。

我想知道如何确定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)

消息框如下所示:

Default 'No' Button

Default 'Yes' Button

部分代码如下:

# -*- 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?