为什么在Getmessage()创建消息队列之前需要peekMessage语句?
我试图无辜地打电话
PeekMessage(&msg, 0, WM_KEYDOWN, WM_KEYUP, PM_NOREMOVE | PM_NOYIELD);
Run Code Online (Sandbox Code Playgroud)
PeekMessage调用中的Windows Vista 64正在处理消息.结果是我将重新加入我的绘画调用以及各种其他代码.
绘画在我们的应用程序中可能需要几秒钟,因此我们添加了PeekMessage调用以查看用户是否按下了一个键,因此我们可以中断该绘画并启动下一个绘画.我们几乎没有意识到Windows可以开始处理我们的消息.将绘画的真实作品放在一个单独的线程中是一个重大的重构...我们试图看看是否按下了特定键,或者是否旋转了鼠标滚轮或鼠标按钮来中断渲染.
我已经尝试专门添加代码以防止重新入侵,然后将绘制消息重新注入队列等等.这些都是非常困难的,并且有些情况下它不能正常工作.
是否有一些我可以添加到PeekMessage调用的标志?我在MSDN上的文档中没有看到任何新内容.我真的需要一个PeekMessage
不处理消息的东西.救命!
我无法让 PeekMessage 工作。实际上,我希望它用消息淹没我,但它的返回值为 0。
我使用 WinForm,启动一个正在查看消息的后台线程并使用鼠标使用窗口。该窗口可以像往常一样使用,但无法查看任何消息。我究竟做错了什么 ?最后一个错误始终为 0。
[StructLayout(LayoutKind.Sequential)]
public struct NativeMessage
{
public IntPtr handle;
public uint msg;
public IntPtr wParam;
public IntPtr lParam;
public uint time;
public Point p;
public override string ToString()
{
return handle + ", " + msg + ", " + wParam + ", " + lParam + ", " + time + ", " + p;
}
}
[DllImport("user32.dll")]
public static extern int PeekMessage(out NativeMessage lpMsg, IntPtr window, uint wMsgFilterMin, uint wMsgFilterMax, uint …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的(Windows)应用程序,使用CreateProcess函数启动另一个应用程序.然后通过使用EnumWindows和新创建的进程的进程ID获取正确的hwnd.
获得hwnd之后,我的应用程序的"主循环"开始了.此循环继续,直到CreateProcess启动的应用程序不再运行.
一切都运行得很好,直到我尝试使用PeekMessage来查看发送到我发起的应用程序的消息 - 似乎我的应用程序没有识别任何消息,但启动的程序(通过CreateProcess)正在运行像往常一样,做它应该做的一切......
我想要实现的,是删除某些消息被发送到应用程序,主要是各种F键(F1,F2..F12键),但如果可能的话,我想更改显示的菜单应用程序(我不知道我的意思是菜单的技术名称,它是你在右上角看到你点击应用程序图标的那个) - 我想添加一个小的'about'选项.
如果有人能够在我的代码中指出我做错了什么,或者为了阻止某些按键到达启动的应用程序更好的替代方案,我将非常感激.
提前谢谢了.:)
这是我目前的代码:
VOID PerformLaunch(LPWSTR lpAppName, LPTSTR lpCmdLine) {
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD dwLoopExitCode = NULL;
BOOL cpBool = FALSE;
BOOL finishedLoop = FALSE;
MSG message = { 0 };
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
cpBool = CreateProcess(lpAppName, lpCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
if (!cpBool) {
MessageBox(Game_HWND, L"Could not start process!", L"Error:", MB_OK | MB_ICONERROR);
}
//-- Enumerate windows until Game_HWND && Game_Hook are not …
Run Code Online (Sandbox Code Playgroud)