user32获取异常系统的GetMessage和peek消息.AccessViolationException:试图读写
本文关键字:AccessViolationException 消息 读写 peek 异常 获取 系统 GetMessage user32 | 更新日期: 2023-09-27 18:19:22
我是新手。我得到这个例外的最后2天,没有得到解决:(它在vs 2008中运行良好,但当我执行exe文件时,它在一段时间后给出异常
例外是
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at clienttesting.EventLoop.GetMessage(MSG& lpMsg, IntPtr hWnd, UInt32 wMsgFil terMin, UInt32 wMsgFilterMax) at clienttesting.EventLoop.Run() in D:'noman'windowsconsole'windowsconsole'Pr ogram.cs:line 196 at clienttesting.Program.Main() in D:'noman'windowsconsole'windowsconsole'Pro gram.cs:line 35
代码是
public static void Run()
{
MSG msg = new MSG();
sbyte ret;
do
{
if ((ret = GetMessage(out msg, IntPtr.Zero, 0, 0)) != -1)
{
Thread.Sleep(1000);
Console.WriteLine("the mesaaeg" + msg.Message.ToString());
if (msg.Message == WM_QUIT)
{
break;
}
if (ret == -1)
{
break; //-1 indicates an error
}
else
{
TranslateMessage(ref msg);
DispatchMessage(ref msg);
}
}
} while (true);
}
异常状态
我知道这个问题已经存在很长时间了,但是我在研究同样的错误时登陆了这个页面。我的情况有点不同,但希望这个答案能帮助到一些人。我正在创建一个。net 6控制台应用程序,但我调用相同的Win32 Api方法。
我正在使用PInvoke。Win32 nuget包,这样我就不用手动做所有的DllImports了。
我的错误是在将第一个参数传递给GetMessage方法时,没有使用操作符'&'的地址。如果您查看文档,您将看到示例也在msg参数前使用'&'。
我看到您在调用GetMessage、TranslateMessage和DispatchMessage时使用out和ref参数修饰符。您试过使用操作符的地址'&'来代替吗?
下面是一个使用新的。net 6控制台模板和PInvoke的相关部分的示例。Win32 nuget包:using PInvoke;
unsafe
{
User32.MSG msg;
while (User32.GetMessage(&msg, IntPtr.Zero, User32.WindowMessage.WM_NULL, User32.WindowMessage.WM_NULL) > 0) // synchonous call, will block the thread till a message is received
{
User32.TranslateMessage(&msg);
User32.DispatchMessage(&msg);
}
}