我在我的应用程序中使用SDL 2.0.5(Win10 x64 vc12),我在其中实现了以下行为:
完整的代码是
#include <SDL.h>
#include <SDL_syswm.h>
#include <chrono>
#include <iostream>
#include <thread>
SDL_Window *sdl_window = NULL;
int EventFilter(void *userdata, SDL_Event *event) {
switch (event->type) {
case SDL_WINDOWEVENT: {
SDL_WindowEvent e = event->window;
switch (e.event) {
case SDL_WINDOWEVENT_ENTER:
std::cout << "window enter\n";
break;
case SDL_WINDOWEVENT_LEAVE:
std::cout << "window leave\n";
break;
default:
break;
}
break;
}
case SDL_MOUSEMOTION: {
SDL_MouseMotionEvent e = event->motion;
std::cout << e.x << ", " << e.y << std::endl;
if (e.x < 20) {
std::cout << "relative mode ON\n";
SDL_SetRelativeMouseMode(SDL_TRUE);
SDL_PumpEvents();
SDL_FlushEvent(SDL_WINDOWEVENT_LEAVE);
}
break;
}
case SDL_MOUSEBUTTONDOWN: {
SDL_MouseButtonEvent e = event->button;
if (e.button == SDL_BUTTON_RIGHT) {
SDL_SetRelativeMouseMode(SDL_GetRelativeMouseMode() ? SDL_FALSE
: SDL_TRUE);
if (!SDL_GetRelativeMouseMode())
SDL_WarpMouseInWindow(sdl_window, 800 / 2, 600 / 2);
}
break;
}
default:
break;
}
return 1;
}
int main(int argc, char *argv[]) {
SDL_Init(SDL_INIT_VIDEO);
SDL_AddEventWatch(EventFilter, NULL);
sdl_window = SDL_CreateWindow(
"test", SDL_WINDOWPOS_CENTERED_DISPLAY(1),
SDL_WINDOWPOS_CENTERED_DISPLAY(1), 800, 600,
SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN | SDL_WINDOW_INPUT_FOCUS);
while (1) {
SDL_PumpEvents();
std::this_thread::sleep_for(std::chrono::milliseconds(20));
}
return 0;
}
使用当前设置,如果我将光标移动到窗口的左边缘快速,它会用完窗口并报告以下事件:
relative mode ON
window leave
怎么可能?对我来说这似乎是一个无效的状态。设置相对鼠标模式后,它不应该离开窗口。我只能通过不对焦/聚焦我的窗口继续使用我的应用程序,这显然不太理想。
我该如何解决或解决这种情况?任何建议表示赞赏!
正如您所看到的,我在设置相对模式后尝试手动刷新窗口离开事件但没有任何更改。
我还尝试在我的循环中使用SDL_PollEvent
,导致状态无效,但以不同的方式:它报告了
relative mode ON
window leave
window enter
之后我还没有收到任何窗口离开/输入事件 。