2012-05-31 3 views
4

Каков наилучший способ применения клавиш-модификаторов клавиатуры к символу, чтобы получить его измененное значение (для текущей культуры)?Применить ключи-модификаторы к символам

Например, со сдвигом нажата (для клавиатуры Великобритании):

Assert.AreEqual('!', Modify('1')); 
Assert.AreEqual('"', Modify('2')); 
Assert.AreEqual('A', Modify('a')); 
Assert.AreEqual('B', Modify('b')); 
Assert.AreEqual(':', Modify(';')); 
Assert.AreEqual('?', Modify('/')); 

У меня есть способ сказать, если клавиши-модификаторы нажимаются, что я не имею способ затем сопоставить правильный символ задан с помощью этого набора ключей-модификаторов.

+0

Я бы сказал, что словарь, но это не очень масштабируемо, особенно если вам нужно поддерживать несколько раскладок клавиатуры. –

+0

@JeffMercado, и это будет еще хуже, если пользователь использует модифицированную пользовательскую раскладку клавиатуры! – Guillaume

+0

@JeffMercado Я считал это, но это для приложения, которое, вероятно, будет использоваться во многих регионах, поэтому просто решить эту проблему просто невозможно. – Martin

ответ

0

В зависимости от того, что вы пытаетесь достичь, следующий может сделать:

[DllImport("user32.dll", CharSet = CharSet.Unicode)] 
    static extern short VkKeyScan(char ch); 

    [Test] 
    public void Test_VkKeyScan() 
    { 
     Assert.AreEqual(VkKey('!'), VkKey('1')); 
     Assert.AreEqual(VkKey('@'), VkKey('2')); 
    } 

    private short VkKey(char p) 
    { 
     return (short)(0xff & VkKeyScan(p)); 
    } 

Построение словаря, используя предоставленный VkKey метод не должен быть слишком много вопрос либо.

UPDATE: Для правильного использования нескольких макетов потребуется использовать VkKeyScanEx вместо VkKeyScan и предоставить текущую или необходимую макет явно в качестве параметра.

Смежные вопросы