Articles of winapi

如何检测相同的键盘按键只有一次

我正在devise一个可以检测键盘按键的键盘类,但是我仍然无法想出办法。 我的目标只是在同一按键同时按下两个动作键的同时按住或保持不动,而只执行一次动作。 例如,当我一直按住A键时,动作1只执行一次。 然后我继续按下或按住另一个键B,动作2也执行一次。 如果我同时按下A和B键,我不能执行任何操作。 在KeyboardClass头文件和cpp文件中有两个类,即KeyboardClientClass和KeyboardServerClass。 //////////////////////////////////////////////////////////////////////////////// // Filename: KeyboardClass.h //////////////////////////////////////////////////////////////////////////////// #ifndef _KEYBOARDCLASS_H_ #define _KEYBOARDCLASS_H_ //////////////////////////////////////////////////////////////////////////////// // Class prototype //////////////////////////////////////////////////////////////////////////////// class KeyboardServerClass; //////////////////////////////////////////////////////////////////////////////// // Class name: KeyboardClientClass //////////////////////////////////////////////////////////////////////////////// class KeyboardClientClass { public: KeyboardClientClass( const KeyboardServerClass& KeyboardServer ); ~KeyboardClientClass(); bool KeyIsPressed( unsigned char keycode ) const; bool KeyIsPressedOnce( unsigned char keycode ); private: unsigned char tempKeyCode; […]

WinAPI SwapBuffers和线程

我想为整个WinAPI消息循环的东西使用不同的线程,所以窗口始终保持响应。 当然,我使用主线程作为“窗口线程”,因为在加载纹理之前我需要一个上下文,我不能只为另一个线程调用Get / PeekMessage。 现在有几件事我很想知道: 我可以使用不同线程的OpenGL上下文句柄吗? 我相对确定,否则就没有办法做multithreading渲染,但也许还有更多。 在某些时候,我必须从render循环中调用SwapBuffers() – 这意味着在这种情况下,从一个不同的线程。 我可以使用我通常使用的HDC吗? 这个句柄是线程安全的吗? 我对此不太确定,但我无法真正find关于这个问题的明确答案。 如果答案是否定的,处理这个问题的方法是什么? 也许我可以从渲染线程发送消息?

控制台(CMD like)在DirectX应用程序中

我真的需要一个控制台来制作游戏。 我现在编程一个第一人称摄像头,我想看看variables(更具体的,我需要知道,如果我得到鼠标input,因为我想或没有),我不知道如何看到它。 我在网上search很多,我发现吨的脚本没有解释,所以我不知道该怎么做。 我需要的是你不使用WINAPI时得到的“noob”命令行。 你只是把你的代码写入dev c ++。 我知道这听起来像我不知道我在说什么,但我不知道如何更好地解决它。

创建一个进程运行在C + + / /我需要运行一个进程在C + +

嘿,我不知道为什么当我编译这个代码,恐惧exe.exe进程没有运行我正在使用Visual Studio的编码ideselect项目是一个win32项目/ /应用程序方法,我正在使用.. 我应该说我添加了一个名为main.c ++的c ++文件的新项目,并且应该使用定义应用程序入口点的代码文件。 或者是否重要? #include "iostream" #include "Windows.h" #include "OVR_CAPI_D3D.h" #include "Win32_DirectXAppUtil.h" #include "stdio.h" #include "string.h" #include "Shlobj.h" #include "Shlwapi.h" using namespace std; int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int) { STARTUPINFO startinfo = { 0 }; PROCESS_INFORMATION processinfo = { 0 }; BOOL bsuccess = CreateProcess(TEXT("E:\SteamLibrary\steamapps\common\FEAR Ultimate Shooter Edition\FEAR.exe"), NULL, NULL, […]

使用Windows API窗口消息实现基于回合的游戏

我正在尝试制作一个2人连线4的游戏,但是我在包装游戏过程中整理事件处理程序的一些概念时遇到了麻烦。 一方面,我有我的窗户: 一个是用于input玩家信息的控制窗口,并具有退出button。 一个是用于绘制和与玩家交互的实际游戏窗口。 一个是popup窗口,询问玩家一个问题,他们必须正确回答这个问题。 另一方面,我有我的实际游戏逻辑。 玩家可以进步如下: //create question window with question and await an answer (game state != WAITING_FOR_ANSWER) //question window is destroyed after the question //if not correct, move onto the next player's turn //if correct, await their move (by clicking on the board, state != WAITING_FOR_MOVE) //then check for win/tie //then perform […]

WinAPi OpenGL无边界全屏 – Alt Tab问题

我正在实现无边框全屏function,并设法做出几乎可行的事情。 使用:C ++,Winapi,OpenGL 3.3。 在全屏无边框模式下,如果alt选项卡的游戏窗口失去焦点,但仍然在顶部,甚至没有alt选项卡窗口显示。 我设法跟踪到SwapBuffers。 如果我禁用它,没有问题,但也没有渲染。 如果我失去焦点时强制隐藏窗口,整个屏幕会闪烁。 如果我退回,只有游戏窗口闪烁。 如果我把游戏置于窗口模式,就像平常一样。 窗口样式首先设置为(窗口模式停在这里): WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE 然后设置为(如果全屏): GetWindowLong(window, GWL_STYLE) & ~WS_OVERLAPPEDWINDOW 我的gameloop: while(isRunning) { loopNewTime = timeGetTime(); loopDuration = (r32)(loopNewTime – loopOldTime); loopTime = Clamp(0.0f, (loopDuration – sleepTime), 250.0f); loopOldTime = loopNewTime; loopAccumulator += loopTime + sleepTime; while(loopAccumulator >= loopFixedDeltaTime) { if(isFocused || […]

像第一人称射击一样移动相机

我正试图用鼠标来实现相机的移动。 我想要达到的结果与您在第一人称射击中移动目标时所获得的结果是一样的。 这是我写的代码,其中“camera”是包含相机位置的vector,“center”是包含相机所指向的点的位置的vector,“move_vector”仅仅是“中心“减去”相机“ if(mouse_move_x != 0 || mouse_move_y != 0){ float a0 = Array_norm<float>(move_vector,3); Array_copy<float>(move_vector,move_vector2,3); //perform mouse horizontal axis movement current_x_angle = atan2(move_vector[2],move_vector[0]); current_x_angle = current_x_angle + mouse_move_x * input::MOUSE_sensitivity * 0.017; move_vector[0] = cos(current_x_angle)*a0; move_vector[2] = sin(current_x_angle)*a0; //perform mouse vertical axis movement temp = sqrt(move_vector2[0]*move_vector2[0]+move_vector2[2]*move_vector2[2]); current_y_angle = atan2(move_vector2[1],temp); current_y_angle = current_y_angle – mouse_move_y * […]

使用WM_INPUT独占鼠标移动

微软似乎建议使用WM_INPUT进行input。 我只想得到相对的鼠标input并将鼠标光标隐藏一会儿(对于基于手势的input)。 但是,在注册input设备时使用RIDEV_CAPTUREMOUSE|RIDEV_NOLEGACY只能防止鼠标单击到其他窗口,但鼠标光标仍然可见并且不受限于我的窗口。 我怎么能隐藏它,使它重新出现在我刚刚input捕捉开始后,我离开了什么? 我知道这已经在FPS控制的背景下被问到过了,但是它似乎总是处于不同的背景下,大多数API已经实现了像这样的鼠标抓取。 还有人提到你可以在每次移动之后隐藏光标并将其重置到窗口的中心。 但是, AFAIR , DirectInput让你独占鼠标光标。 所以,既然这个弃用赞成WM_INPUT ,是没有DX的方式去“旧的方式”,或者是有什么新的WM_INPUT运作良好? 谢谢!

OpenGL如何与Windows GDI协同工作以在电脑屏幕上生成输出图像?

我很好奇GDI如何与OpengGL集成以创建电脑屏幕的图像。 我知道GDI提供描述窗口属性的设备上下文,据我所知它也提供基于2D软件的渲染。 然后基于设备上下文,为OpenGL创建渲染上下文。 在渲染过程中,OpenGL维护存储在GPU内存中的framebuffer对象,然后将这些缓冲区以某种方式推送到屏幕上? 但是,在这个过程中,GDI有什么作用? 我知道GDI负责将图像传输到graphics设备…所以这意味着framebuffer的内容被传输到CPU RAM,然后再传输到GPU,以便将其传输到显示器! 这听起来不合逻辑… 为什么这种基于软件的绘图组件(GDI)与OpenGL一起使用,它应该能够直接从帧caching(GPU内存)发送图像来显示? 我不明白 Windows UI如何呈现? 桌面,文件夹,开始菜单等是基于软件或基于GPU的渲染?

在Windows API中创建一个全屏窗口

我有一个Windows API窗口。 我已经设法使窗口,“全屏窗口”。 但我似乎无法使窗口变成全屏 – 例如,即使我指定了WS_POPUP ,我仍然可以自由地将光标移动到我的第二个屏幕上。 但是,如果我启动全屏游戏,他们不允许,只存在或最小化。 我怎样才能建立一个这样的窗户? 编辑:对不起。 限制鼠标移动只是全屏窗口与非全屏窗口行为不同的一个例子,我不想要限制鼠标移动。 或者,这是在D3DPRESENT_PARAMETERS中设置的,而不是仅仅传达?