Как определить раскладку?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 14 Mar 2008.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Надо определить чем вводится текст кириллицей или латинецей.Естетвенно я знаю о GetLocaleInfo но оно как им некрути возращает только 0419 :( А мне нада както узнать вводится ли руский текст или английский.
     
  2. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    if GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, null)) == 67699721
    //раскладка английская
    else
    //раскладка НЕанглийская, например 68748313 соответствует русской

    вроде так ...
     
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Мне нада это сделать в консольной проге.А GetWindowThreadProcessId насколько я понимаю без WinMain непокатит.
     
  4. noobyara

    noobyara Member

    Joined:
    27 Jan 2008
    Messages:
    13
    Likes Received:
    8
    Reputations:
    0
    Видимо правильнее сравнивать не возвращаемое значение, а его low word с индификатором раскладки. к примеру:
    Code:
    HKL hKl = GetKeyboardLayout(GetCurrentThreadId());
    WORD id = LOWORD(hKl));
    
    switch(id){
    case 0x0419:break;//рус
    case 0x0409:break;//анг
    }
    И если тебя надо знать раскладку только твоего приложения(с учетом того что оно однопоточное), используй GetCurrentThreadId() вместо GetWindowThreadProcessId()

    и
     
    #4 noobyara, 14 Mar 2008
    Last edited: 14 Mar 2008
  5. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    У меня подобный код показывает только раскладку по-умолчанию, а совсем не ту, которая включена. В чём может быть проблема?
     
  6. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Аналогично,сколько Alt+Shift неклацай выдает одно и тоже значение.
     
  7. noobyara

    noobyara Member

    Joined:
    27 Jan 2008
    Messages:
    13
    Likes Received:
    8
    Reputations:
    0
    просто у вас консольное приложение, там система ввода-вывода по другому устроена и код написанный выше, будет работать только с оконным приложением..
     
  8. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    Придумал гениальный способ:
    читаешь символы, после этого:
    if (('a' < ch) and (ch < 'z')) or (('A' < ch) and (ch < 'Z')) then
    // английская раскладка
    else
    // русская...
     
  9. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Не махлюй надо средствами WinAPI :D
     
  10. KindEcstasy

    KindEcstasy Banned

    Joined:
    30 Sep 2006
    Messages:
    105
    Likes Received:
    64
    Reputations:
    54
    чё мудрить то? =\

    Code:
    buffer db KL_NAMELENGTH dup (?)
    
    push offset buffer
    call GetKeyboardLayoutName
    
    
    потом lstrcmp сравниваешь и всё )
     
    #10 KindEcstasy, 15 Mar 2008
    Last edited: 15 Mar 2008
  11. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    А ето что?
    ReadConsoleA, потом проверяешь то что счситал=)
     
  12. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    думаю вопрос исчерпан