2017-04-26 148 views
2

我已經創建了一個實現了下面的代碼數字鍵盤自定義表單:虛擬鍵盤失去焦點

private void btn1_Click(object sender, EventArgs e) 
    { 
     PressKey(Keys.D1); 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); 

    public static void PressKey(Keys key) 
    { 
     const int KEYEVENTF_EXTENDEDKEY = 0x1; 

     keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0); 
    } 

我也用以下塊

protected override bool ShowWithoutActivation 
    { 
     get { return true; } 
    } 

它可以作爲魅力對於記事本,單詞或其他編輯器(以及使用基本的SendKeys方法),但在我的應用程序中,在我打算使用它(或其他可編輯控件)的網格單元格中,它無法插入值。 意外地我發現它只能插入一次值,當單元格不處於編輯模式時,但它具有焦點。

從一種形式到另一個虛擬鍵盤的任何履行例如將高度讚賞

+0

開始 - >運行 - > osk.exe。問題解決了,沒有必要的代碼。 –

+0

感謝科迪,但這不是一個解決方案。該應用程序將運行在Windows 7嵌入式的POS設備上,鍵盤沒有數字變體作爲數字鍵,客戶要求 – AlexSen

+0

我的猜測是您將第一個鍵發送到具有焦點的單元格,但在此之後,你以某種方式關注焦點。也許你應該檢查重點在哪裏,誰收到下一個輸入... –

回答

0

(太長了評論,但也許沒有足夠的答案)

我們曾經開發這樣的鍵盤,並且我們使用了SendKeys class from the .Net Framework(這僅僅是SendInput Win32 API call的包裝)。

鍵盤形式重寫Property CreateParams,所以我們可以明確告訴它不要把焦點(或密鑰被髮送到鍵盤的形式...)

protected override CreateParams CreateParams 
{ 
    get 
    { 
     var CreateParams cp = base.CreateParams; 
     cp.ExStyle = cp.ExStyle | WS_EX_NOACTIVATE; 
     return cp; 
    } 
} 

注:我們注意到,有些計劃如Ultra VNC(用於遠程控制)會阻止正確使用鍵盤。我猜UltraVNC是通過它的驅動程序重新路由輸入鍵,並在途中丟失了一些東西,但從來沒有發現什麼。

+0

感謝@馬丁。我也使用類似的東西 'protected override CreateParams CreateParams { get { CreateParams baseParams = base.CreateParams; const int WS_EX_NOACTIVATE = 0x08000000; const int WS_EX_TOOLWINDOW = 0x00000080; baseParams.ExStyle =(int)(WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW); return baseParams; } }' 但它似乎沒有工作。 – AlexSen