算术运算导致InputLanguageChangingEventArgs溢出

时间:2014-09-02 09:13:25

标签: c# winforms exception

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

这是异常消息和堆栈跟踪:

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)

异常消息是“算术运算导致溢出”。

之前有没有人经历过这样的行为

2 个答案:

答案 0 :(得分:0)

这实际上是.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,如果有一些较高的位,则会导致OverflowExceptionhandle已设置。

我能想到的唯一解决方法是完全过滤掉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;
    }
}

答案 1 :(得分:0)

我已经看到" OverflowException"在Greenshot,我研究过这里,我到了这里。

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

以下是一些信息"输入语言信息的内容是什么?":http://www.siao2.com/2006/05/16/598980.aspx

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

相关问题