- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于我的一些 python 应用程序,我正在使用 ctypes 和 Windows API 安装系统 Hook ,为了使它们工作,必须运行消息循环。因为我在前台发生了其他事情,所以这个消息循环被设置为作为后台线程运行。这部分工作正常,但是当我想停止这个后台线程时,我无法让它退出,GetMessage 函数应该在收到 WM_QUIT 消息时返回 0 并且我的消息循环的主体应该返回 0 但由于某种原因它永远不会.我尝试了 SendMessage、PostMessage、PostThreadMessage 和 PostQuitMessage 的各种组合,但都没有成功。
#!python3
import tkinter as tk
import ctypes
import ctypes.wintypes
from threading import Thread
user32 = ctypes.windll.user32
def loop():
msg = ctypes.wintypes.MSG()
while user32.GetMessageW(ctypes.byref(msg), 0, 0, 0) != 0:
print('msg')
user32.TranslateMessageW(msg)
user32.DispatchMessageW(msg)
print('end of loop')
def SendMessage1():
user32.SendMessageA(0xFFFF, 0x001C, 0, 0) # broadcast handle, app_activate message
def SendMessage2():
user32.SendMessageA(0, 0x001C, 0, 0) # null handle
def PostMessage1():
user32.PostMessageA(0xFFFF, 0x001C, 0, 0)
def PostMessage2():
user32.PostMessageA(0, 0x001C, 0, 0)
def PostThreadMessage1():
user32.PostThreadMessageA(0xFFFF, 0x001C, 0, 0)
def PostThreadMessage2():
user32.PostThreadMessageA(0, 0x001C, 0, 0)
def PostQuitMessage1():
user32.PostQuitMessage(0)
def PostQuitMessage2():
user32.PostQuitMessage(0)
root = tk.Tk()
t = Thread(target=loop)
t.daemon=True
t.start()
tk.Button(root, text='SendMessage 1', command=SendMessage1).pack()
tk.Button(root, text='SendMessage 2', command=SendMessage2).pack()
tk.Button(root, text='PostMessage 1', command=PostMessage1).pack()
tk.Button(root, text='PostMessage 2', command=PostMessage2).pack()
tk.Button(root, text='PostThreadMessage 1', command=PostThreadMessage1).pack()
tk.Button(root, text='PostThreadMessage 2', command=PostThreadMessage2).pack()
tk.Button(root, text='PostQuitMessage 1', command=PostQuitMessage1).pack()
tk.Button(root, text='PostQuitMessage 2', command=PostQuitMessage2).pack()
root.mainloop()
我还尝试了这些函数的 A 和 W 变体。我认为问题可能是因为我无法获得实际监听消息的线程的句柄,而且我也找不到这方面的任何文档。
我还研究了在该线程上下文中引发异常,但是因为挂起是在 dll 中而不是在 python 代码中,GIL 已经被释放并且这不会导致它退出。
如何让这个线程正常退出?
最佳答案
确定我确实需要线程句柄,并且可以使用 threading.Thread
的 native_id
属性访问它:
#!python3
import tkinter as tk
import ctypes
import ctypes.wintypes
from threading import Thread
user32 = ctypes.windll.user32
kernel32 = ctypes.windll.kernel32
WM_QUIT = 0x0012
tid = None
def loop():
msg = ctypes.wintypes.MSG()
while user32.GetMessageW(ctypes.byref(msg), 0, 0, 0) != 0:
print('msg')
user32.TranslateMessage(msg)
user32.DispatchMessageW(msg)
print('end of loop')
def PostThreadMessage():
user32.PostThreadMessageW(tid, WM_QUIT, 0, 0)
root = tk.Tk()
t = Thread(target=loop)
t.daemon=True
t.start()
tid = t.native_id
tk.Button(root, text='PostThreadMessage', command=PostThreadMessage).pack()
root.mainloop()
关于python user32.GetMessage 永远不会退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50603171/
我想知道使用 GetMessage 与 GetMessages 逐一获取消息的开销是多少?我应该始终使用 GetMessages(32) 吗?它比 GetMessage() 有什么优势吗? 最佳答案
我想知道使用 GetMessage 与 GetMessages 逐一获取消息的开销是多少?我应该始终使用 GetMessages(32) 吗?它比 GetMessage() 有什么优势吗? 最佳答案
Like in this picture 我知道它们都可以正常工作,但我只是想知道它们之间有何不同? PS:我是初学者。 最佳答案 A LogEvent可以同时包含消息和异常。如果您使用第一种形式:
我观察到这两种说法都是有效的。与第二个语句相比,第一个语句中记录的额外内容是什么? 最佳答案 第一个还记录原始异常(和堆栈跟踪),第二个仅记录消息。 因此,第一个语句中记录的“额外内容”是原始异常。这
我的问题是:用 getMessage 或 toString 或两者都记录更好吗?考虑到开源引发的错误。看到评论中的问题,但没有得到答案。也许我错过了什么?不要介意记录其中之一的小性能影响,但除非有充分
当针对返回 null 的 NullPointerException 引发时,我在 exception.getMessage() 方法中遇到问题。 如何覆盖基本 Exception.getMessage
如何让 MyException 和 MyRuntimeException 使用相同的自定义 getMessage() 实现? 由于 Java 没有多重继承,我不知道该怎么做。目前我在两个类中都有重复的
public class TestException extends Exception { public TestException() { super("Test
我有一个串行设备,可以传输多种类型的消息作为应答。每个消息头代表消息类型。每种消息类型都有其一组字段。我永远不知道我会收到哪种消息类型。 在我的代码中,每种消息类型都代表类。借助 getMessage
这个问题已经有答案了: Can the HWND from CreateWindow/CreateDialog be GetMessage'd from another thread? (7 个回答)
多年来,我在各种不同的程序中使用了以下功能。它一直没有错误。直到现在,我第一次尝试让它针对 64 位代码工作。 我尝试逐行执行代码...首先我执行 something_done = TRUE; 这行(
如果 GetMessage(...) 失败,消息是否不会从消息队列中删除?我问是因为当我有以下循环时,我最终会进入一个无限循环,试图一遍又一遍地处理相同的消息: while( GetMessage(
我有一个应用程序,第二个线程在循环中调用 GetMessage()。在某些时候,第一个线程意识到用户想要退出应用程序并通知第二个线程它应该终止。由于第二个线程卡在 GetMessage() 上,因此程
我有这些类(class): public class NegativeNumberException extends Exception{ NegativeNumberExceptio
当我在 php 中捕获异常并尝试输出一些详细信息时,getMessage() 总是不返回任何内容。如果我执行 var_dump(),我会看到我想要显示的消息。我做错了什么?
嗨,我有下面的伪代码抛出这样的异常 throw new MyException("Bad thing happened","com.stuff.errorCode"); 其中 MyException
我需要更改方法 getMessage() 的返回消息, 例如,我有一个 ArithmeticException,当我写时: try{c=a/0;} catch(ArithmeticException
我试图捕获异常然后将其显示在 JTextArea 中,但我得到了 null... 这里是: } catch (Exception rwe) { // System.
使用 BitmapFactory.decodeStream 函数,我得到了以下异常 02-22 13:24:34.129: W/System.err(7927): java.io.FileNotFou
我有以下代码 SendApp,点击按钮[X]时,执行以下代码 HWND pHWndReceiveApp = FindWindowA(NULL, "ReceiveApp"); if (NULL
我是一名优秀的程序员,十分优秀!