同步issue #1138
主要是在运行 example/keyboard 的时候发现的问题。
测试代码:
import taichi as ti
x, y = 0.5, 0.5
gui = ti.GUI("event test")
while True :
while gui.get_event(ti.GUI.PRESS):
print("press key : {}".format(gui.event.key))
if gui.is_pressed(ti.GUI.LMB , ti.GUI.RMB):
x, y = gui.get_cursor_pos()
gui.circle((x,y) , radius= 8)
gui.show()
开始能够正常获取到鼠标的点击事件,但是尝试按键时,发现并没有print 。
此时开始所有事件都取不到了,鼠标点击,移动窗口都不再有响应。
我的环境是win10 + python 3.7.2 + taichi 0.6.7
有没有小伙伴在其他环境测试过这个example的 ,看下能否正常运行 (:3 」∠)
没初始化?
加一句 ti.init(debug=True, arch=ti.cpu)
例子有问题是因为有 bug
得改成 if gui.is_pressed(ti.GUI.LEFT, 'A')
。这里代指按键需要用大写。
加了初始化没有影响。
主要问题是按键之后,不但get不到按键的event , 连鼠标click这些事件都get不到了。
和LZ 一样的环境, 我也记得遇到过wsad 等字母按键有问题, 方向键和鼠标没问题。
并没有。。怎么试怎么不行。。
gui.py打log都找不到event,我已经打算拿cpp代码下来编译试试了 _(:3」∠)_
我又来更新了,跟我以前自己写的win32 demo 对比了一晚上 ,问题出处基本找出来了…
同样的问题在我win10 2004 pro insider version 的台式上能命中 ,win10 1909 home的笔记本上又正常 _(:3」∠)_
就在 gui/win32.cpp
的这段 :
if (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) {
调试器看了按键触发取回来的msg的值发现里面这个 msg.hwnd
在win 10 2004 Pro上 是NULL值,在家庭版等于窗口的hwnd …
所以在我专业版win10上,这个msg没有被处理,连带队列后面所有的msg都被堵住, 鼠标click 甚至WM_PRINT 这些消息也响应不了了。
代码改成:
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
重新build之后 ti example/keyboard.py
顿时清爽_(:3」∠)_
有没有了解windows 消息循环机制的 member来讨论下这里确定是否可以设NULL。
手动 @yuanming @woclass @archibate
3 个赞
我是 1909 难怪无法复现。
msg.hwnd
可以为空,大概是个新 feature?
msg.hwnd
This member is NULL when the message is a thread message.
hWnd
参数设为空,刚好就能收到消息了。非空的时候只收 hWnd
对应 window 的消息。
文档还说了 msg.hwnd
为空的消息是怎么发出来的。
BOOL PeekMessageW(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);
if hWnd
is NULL , both window messages and thread messages are processed.
If hWnd is -1, PeekMessage retrieves only messages on the current thread’s message queue whose hwnd value is NULL , that is, thread messages as posted by PostMessage (when the hWnd parameter is NULL ) or PostThreadMessage.
我也不确定这个究竟是pro和home之间的问题还是1909和2004的问题 …
不过taichi如果不考虑实现完整的GUI系统的话,直接改成 NULL也可以用了