gpt4 book ai didi

c# - 什么会导致 WM_NCHITTEST lParam 溢出 32 位整数?

转载 作者:行者123 更新时间:2023-11-30 12:57:38 29 4
gpt4 key购买 nike

在什么情况下,消息WM_NCHITTESTlParam 会是一个不适合32 位整数的值?

由于我们的 WPF 应用程序中存在未处理的异常,我们的一位客户在他的 64 位计算机上遇到了崩溃,我很难找到原因。正在从 WPF 代码 引发异常,如堆栈跟踪所示:

System.OverflowException: Arithmetic operation resulted in an overflow.
at Microsoft.Windows.Shell.WindowChromeWorker._HandleNCHitTest(WM uMsg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at Microsoft.Windows.Shell.WindowChromeWorker._WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.PublicHooksFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
 at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

违规方法 _HandleNCHitTest 的来源是 here .

我能看到抛出溢出异常的唯一方法是在将 lParam 转换为 Point 的代码中,它调用 IntPtr.ToInt32() here .如果 lParam 不适合 Int32,则会引发此异常。但是,我想不出会发生这种情况的情况。是什么让这一切发生?

最佳答案

简短回答:使用自 .NET 4.5 以来集成的 WindowChrome。


如果您不能切换到 .NET 4.5,请详细回答,这似乎对我有用,请参阅我对原始问题的评论。你永远无法确定,因为这个问题有时只出现在某些机器上,而不是所有 x64 机器上:

我修改了 WPF Shell Integration Library v2 的源代码。更改的行标有 <----在最后。

WindowChromeWorker.cs:

    private IntPtr _HandleSize(WM uMsg, IntPtr wParam, IntPtr lParam, out bool handled)
{
const int SIZE_MAXIMIZED = 2;

// Force when maximized.
// We can tell what's happening right now, but the Window doesn't yet know it's
// maximized. Not forcing this update will eventually cause the
// default caption to be drawn.
WindowState? state = null;
if (wParam.ToInt64() == SIZE_MAXIMIZED) <-----
{
state = WindowState.Maximized;
}
_UpdateSystemMenu(state);

// Still let the default WndProc handle this.
handled = false;
return IntPtr.Zero;
}

实用程序.cs:

    [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static int GET_X_LPARAM(IntPtr lParam)
{
return LOWORD(lParam.ToInt64()); <----
}

[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static int GET_Y_LPARAM(IntPtr lParam)
{
return HIWORD(lParam.ToInt64()); <----
}

[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static int HIWORD(long i) <----
{
return (short)((i >> 16) & 0xFFFF); <----
}

[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public static int LOWORD(long i) <----
{
return (short)(i & 0xFFFF);
}

TaskbarItemInfo.cs:

    private IntPtr _WndProc(IntPtr hwnd, int uMsg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
WM message = (WM)uMsg;

if (message == WM_TASKBARBUTTONCREATED)
{
_OnIsAttachedChanged(true);
_isAttached = true;

handled = false;
}
else
{
switch (message)
{
case WM.COMMAND:
if (Utility.HIWORD(wParam.ToInt64()) == THUMBBUTTON.THBN_CLICKED) <-----
{
int index = Utility.LOWORD(wParam.ToInt64()); <----
ThumbButtonInfos[index].InvokeClick();
handled = true;
}
break;
case WM.SIZE:
_UpdateThumbnailClipping(_isAttached);
handled = false;
break;
}
}

return IntPtr.Zero;
}

关于c# - 什么会导致 WM_NCHITTEST lParam 溢出 32 位整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33287542/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com