2012-10-11 47 views
5

我有一個帶有數據網格的WPF窗口。我試圖從符號掃描器中捕獲通過虛擬楔子發送的字符串。對於應用程序,它看起來像字符被鍵入。該字符串以ASCII 1(SOH)開頭。DataGrid PreviewTextInput事件從輸入中刪除控制字符

當窗口有焦點時,窗口的PreviewTextInput會接收SOH以及所有其他人類可讀和非人類可讀的值。 但是,當datagrid具有焦點時,非人類可讀的字符將被刪除。

如果我在窗口上有一個PreviewKeyDown或PreviewKeyUp,那麼無論焦點是什麼,字符都能正確顯示。因此,在數據網格的某個地方將其剝離。不幸的是,因爲KeyDown/KeyUp不顯示ASCII字符,我不能使用這些事件,而不必編寫某種解析算法。

任何人都可以告訴我,我能做些什麼來讓這些非人類可讀的控制字符始終發送到PreviewTextInput?或者如何解析PreviewKeyDown中的所有字符?

編輯:

當窗口具有焦點:

Window PreviewKeyDown - LeftCtrl 
Window PreviewKeyDown - A 
Window PreviewTextInput - <SOH> 
Window PreviewKeyDown - Oem6 
Window PreviewTextInput - ] 
Window PreviewKeyDown - LeftShift 
Window PreviewKeyDown - C 
Window PreviewTextInput - C 

當數據網格具有焦點:

Window PreviewKeyDown - LeftCtrl 
DataGrid PreviewKeyDown - LeftCtrl 
Window PreviewKeyDown - A 
DataGrid PreviewKeyDown - A 
Window PreviewKeyDown - Oem6 
DataGrid PreviewKeyDown - Oem6 
Window PreviewTextInput - ] 
Window PreviewKeyDown - LeftShift 
DataGrid PreviewKeyDown - LeftShift 
Window PreviewKeyDown - C 
DataGrid PreviewKeyDown - C 
Window PreviewTextInput - C 
+0

我的回答任何想法?它有幫助嗎? – Alan

回答

1

好吧,我知道這可能是不太你期待,但我有一些經驗爲一些Symbol條形碼掃描儀編寫軟件。在一個應用程序中,我們讓用戶掃描他們的徽章進行身份驗證以覆蓋某些條件。我們希望用戶「掃描」他們的徽章,而不能用鍵盤輸入數字。我記得我們花了很長時間試圖弄清楚如何讓輸入不像鍵盤輸入一樣。我相信我們能夠從Symbol條形碼掃描儀的手冊中掃描一些配置代碼,將其配置爲我們可以打開並處理其輸入的USB設備,但是我們希望。這種方法對我們來說更好。

你有沒有考慮嘗試類似的東西?

這篇文章在MSDN論壇上,似乎相關(Converting Key To ASCII

條形碼閱讀器通常可以工作在兩種模式,一種是它作爲一個鍵盤口,就好像用戶鍵入的代碼生成按鍵。另一個是應用程序直接接收掃描過的代碼的地方,通常是通過一個串行端口,你將讀者切換到一個模式,在那裏它產生適合後一種方式的代碼Ctrl + B是一個控制代碼SOH(Start Of頭文件),它用於使程序與讀卡器同步,SOH指示掃描的開始,您將使用它來重置緩衝區索引

您需要將閱讀器配置爲不生成控制字符的鍵盤楔模式。如果需要,您仍然可以通過編寫KeyDown事件處理程序,檢測SOH和KeyPressed事件處理程序來檢測掃描代碼。避免嘗試將您在KeyDown中看到的按鍵轉換爲字符,KeyPressed已經爲您做到了這一點。

我認爲這可能爲你工作轉換爲ASCII:

[DllImport("user32.dll")] 
    static extern int ToAsciiEx(uint uVirtKey, uint uScanCode, byte[] lpKeyState, byte[] arr, uint uFlags, IntPtr hkl); 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool GetKeyboardState(byte[] lpKeyState); 


    private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     byte[] keyboardState = new byte[256]; 
     int keyCode = KeyInterop.VirtualKeyFromKey(e.Key); 
     byte[] arr = new byte[4]; 
     GetKeyboardState(keyboardState); 
     Debug.WriteLineIf(ToAsciiEx((uint)keyCode, 0, keyboardState, arr, 0, IntPtr.Zero) > 0, ASCIIEncoding.ASCII.GetString(arr)); 
    }