GUI 无法获取按键事件

同步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 等字母按键有问题, 方向键和鼠标没问题。

同样的环境,没什么问题,LZ现在解决了吗

群里看了看大家都没法复现。。。就有点怪。。

并没有。。怎么试怎么不行。。
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也可以用了