2014-01-29 51 views
2

我們有一個.NET 2.0 Windows窗體應用程序,其中包含許多自定義控件。幾年前,我們將應用程序全球化,因此用戶可以看到適合特定文化的符號和翻譯。文化特定處理Windows窗體中的數字小鍵盤小數點鍵

法國加拿大客戶要求我們更改我們的應用程序處理數字小數點鍵的方式。當用戶按下此鍵時,我們的數字控件沒有做任何事情。

我將我的Windows區域設置切換到法國 - 加拿大並調試我們的應用程序。我看到當前的文化和當前的UI文化被設置爲fr-CA。

在OnKeyDown和OnKeyPress中我看到鍵盤週期(Keys.OemPeriod)和數字鍵盤週期(Keys.Decimal)之間的區別。 OnKeyDown中會出現特定的按鍵。然而,在這兩種情況下,該事件的OnKeyPress給我們的控制期:

Key    OnKeyDown  OnKeyPress 
================= ============== ========== 
Main Keyboard  Keys.OemPeriod "." 
Number Pad Period Keys.Decimal "." 

我們的數字控制處理的事件的OnKeyPress號碼輸入。由於該期間不是當前文化中的小數分隔符,因此控制拒絕這個字符。

全球化設置是否應該將Keys.Decimal(數字鍵盤「。」)自動轉換爲逗號,還是我們的應用程序應該將Keys.Decimal更改爲文化特定的小數點分隔符?我期望.NET自動完成這個翻譯。

回答

1

OnKeyDown事件由Windows WM_KEYDOWN事件生成。 WM_KEYDOWN正在向我們的應用程序發送一個Key.Decimal事件。

同樣,OnKeyPress事件直接從WM_CHAR事件生成。在法語 - 加拿大區域設置(使用加拿大法語鍵盤)的情況下,Windows會在用戶按下數字鍵盤十進制鍵時發送WM_CHAR事件。但是,對於使用「比利時(逗號)」輸入設置的法語 - 比利時語設置,Windows會發送一個WM_CHAR事件,其中包含一個逗號

所以這不是一個.NET錯誤,也不是我們的應用程序中的錯誤。區域輸入設置會影響Decimal鍵的行爲。

但是,有些應用程序在法國 - 加拿大設置中做出了不同的響應。例如,Excel和Windows計算器都將Keys.Decimal轉換爲逗號而不是句點。這些應用程序可能對這種情況有特殊的處理。

我們可以添加代碼到我們的應用程序來跟蹤一個十進制的鍵,並以不同的方式處理它。例如:

protected override void OnKeyDown(KeyEventArgs e) 
{ 
    if (e.KeyData == Keys.Decimal) 
     m_DecimalKey = true; 
} 

protected override void OnKeyPress(KeyPressEventArgs e) 
{ 
    ... 
    if (m_DecimalKey || e.KeyChar == CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator) 
    { 
     // this is a decimal separator 
    } 
} 

protected virtual void OnKeyUp(KeyEventArgs e) 
{ 
    if (e.KeyData == Keys.Decimal) 
     m_DecimalKey = false; 
}