算术运算导致InputLanguageChangingEventArgs溢出

本文关键字:溢出 InputLanguageChangingEventArgs 算术运算 | 更新日期: 2023-09-27 18:20:22

我遇到一个用户问题,我的应用程序在没有特定原因的情况下抛出了一个未处理的异常。我不确定是什么原因导致了这种情况,因为应用程序本身既没有检查也没有处理任何与输入语言更改事件远程相关的事情。异常非常模糊,因为它没有内部异常或任何其他信息告诉发生了什么,因为它似乎是一个算术溢出异常。

以下是异常消息和堆栈跟踪:

Type:        System.OverflowException
Message:     算術演算の結果オーバーフローが発生しました。
Source:      System.Windows.Forms
Stack Trace: 場所 System.Windows.Forms.InputLanguageChangingEventArgs..ctor(InputLanguage inputLanguage, Boolean sysCharSet)
   場所 System.Windows.Forms.Control.WmInputLangChangeRequest(Message& m)
   場所 System.Windows.Forms.Control.WndProc(Message& m)
   場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
   場所 System.Windows.Forms.Button.WndProc(Message& m)
   場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

异常消息为"算术运算导致溢出"。在之前有人经历过这种行为吗

算术运算导致InputLanguageChangingEventArgs溢出

这实际上是.NET Framework中System.Windows.Forms.InputLanguage.Culture getter中的一个错误(您无法在堆栈跟踪中看到它,因为JIT将它内联在InputLanguageChangingEventArgs..ctor中):

public CultureInfo Culture
{
    get
    {
        return new CultureInfo((int)this.handle & 65535);
    }
}

这里,this.handleIntPtr,这意味着它在x64操作系统上是64位,但被错误地转换为int,如果设置了该handle中的一些高位,则会导致OverflowException

我能想到的唯一解决办法是完全过滤掉handle不适合int类型的消息:

// call this before Application.Run():
Application.AddMessageFilter(new WmInputLangChangeRequestFilter());
class WmInputLangChangeRequestFilter : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == 0x0050)
        {
            return (long)m.LParam > 0x7FFFFFFF;
        }
        return false;
    }
}

我在Greenshot中看到了"OverflowException",我在那里研究了这一点。

以下是该问题的一些附加信息:在MSDN上有一些评论:https://msdn.microsoft.com/en-us/library/windows/desktop/ms632630(v=vs.85).aspx据说Windows消息没有发布在例如Windows 7上,我可以确认我从未见过它,也无法复制它。

这里还有一些信息"是什么破坏了输入语言消息?":http://www.siao2.com/2006/05/16/598980.aspx

我目前认为,对于我的应用程序来说,消息并不重要,所以我添加了Torvin的解决方案来忽略它…