- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在什么情况下,消息WM_NCHITTEST
的lParam
会是一个不适合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/
在我的工作线程中,我创建了一条发送到主对话框的消息。一旦主对话框收到消息并进入我的 OnStatusUpdate() 函数,我想从 LPARAM lParam 中提取消息并将其显示在对话框编辑框中。我
我的应用程序有一个工作线程,我使用 PostMessage 将字符串发送到主线程。对于 1 条消息,当字符串到达主线程中的消息处理程序时,该字符串将被截断。 该字符串是在工作线程中根据如下所示的原
我在here中看到了下面这段代码。我测试了一下,一切正常。 // g_hLink is the handle of the SysLink control. case WM_NOTIFY: s
我使用的是 Visual C++/MFC,我发送的消息为 SendMessage(GetParent(hDlg) ,MY_MESSAGE , 0 , LPARAM(x) ); 如何在 hDlg 父回调
我想检测计算机中任何 USB 驱动器的插入和移除。我没有Windows GUI编程的经验,通常使用Qt,但这次我不得不使用Win32 API。 问题是 lParam 总是空的。 我读到我需要使用 Re
我有一个树状 View ,列出了拖放到它上面的文件。 当我创建一个新的 treeview 项目时,我想将文件的地址作为字符串存储在该项目中,并在以后的某个时间点出于各种恶意目的检索它。 查看 Micr
我知道当我收到 WM_KEYDOWN 事件时,LPARAM 变量设置了某些位(在其内部)以识别长按键等信息。 所以我试图分解一个 LPARAM 变量并查看各个位值组和位组以及该值(例如查看第 16 到
我想创建自己的 LPARAM 以传递给 win32 函数 GetKeyNameText(),(第一个参数采用 LPARAM var)。 这可能看起来像是在用困难的方式做事,但它是一种解决方法,因为没有
我已经设置了一个 WH_MOUSE 钩子(Hook),一切正常,除了我无法获得传递给我的 HOOKPROC 函数在 C# 中正确翻译。 我的项目由两部分组成,C++ 中的非托管部分执行 Hook 和过
我正在构建一个非常简单的 win32 控制台应用程序,该应用程序用 C 编码并使用 Visual Studio 2010/2013 编译。它将有一个消息队列在与主线程不同的线程中运行。控制台将从 VB
我正在尝试使用 TreeView_SetItem 设置 lParam 但它不起作用。下面的测试代码使用TreeView_GetItem 来显示lParam 在用TreeView_SetItem 设置后
我在 View 中有 2 个 CEdit 控件,它们都有相同的 ID。 在父窗口中,我创建了 ON_EN_CHANGE 句柄来捕获他们的编辑消息。由于编辑其中任何一个编辑框都会向 handle 函数发
我正在尝试将其包含到我的对话框窗口过程中,当收到消息 WM_CTLCOLORSTATIC 时,我将获得发送消息的控件的 ID。 case WM_CTLCOLORSTATIC: UINT
首先,这个函数被调用了很多次。需要注意的是 wString[] 确实包含字符常量 '\n'。 void D2DResources::PutToLog(WCHAR wString[]) { in
我知道 wParam 和 lParam 是(我相信是 32 位)特定于当时正在传递的消息的信息位,但是有什么方法可以分辨每条消息放入这两个消息中的内容吗? 我在某处读到 wParam 是 16 位而
我编写了下面的代码。我在我的程序中使用过它,它似乎有效。无论如何,我在问它是否正确。 int SendMessageWMSIZE(HWND hwnd) { RECT rc; GetCl
public class sendKeys { [DllImport("user32.dll")] public static extern IntPtr FindWindow(str
在 MSDN 上,对于 WM_KEYDOWN 定义,它表示 lparam 的位包含: Bits Meaning 0-15 The repeat count for the current
一个标准的窗口过程函数采用这个原型(prototype): LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM l
无论从文件中检索到什么数据,我都需要在文本框中显示文本。 在 Windows 应用程序中按下特定按钮 (IDB_SHOW_BUTTON) 时,我正在执行以下操作:- case IDB_SHOW_BUT
我是一名优秀的程序员,十分优秀!