算术运算导致InputLanguageChangingEventArgs发生溢出

问题描述:

我遇到了一个用户问题,我的应用程序只是抛出异常而没有特别原因。我不确定是什么导致了这种情况,因为应用程序本身不检查也不处理与输入语言改变事件有关的任何事情。这个例外非常模糊,因为它没有内部异常或任何其他信息来说明发生了什么,因为它似乎是算术溢出异常。算术运算导致InputLanguageChangingEventArgs发生溢出

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

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) 

异常消息为“算术运算导致溢出”。有没有人经历过这样的行为

+0

这是一个环境问题,不是由您的代码引起的任何问题。您的客户必须再次让自己的机器稳定下来,重点关注控制面板+语言中已安装的语言。鉴于这是日本人,可能是某种自定义IME。 – 2014-09-02 09:25:07

这实际上是.NET Framework中的一个错误之前,在System.Windows.Forms.InputLanguage.Culture吸气(你不能看到它的堆栈跟踪,因为它得到由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的解决方案忽略它...