Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2015, 11:22   #1
CheChe
Пользователь
 
Аватар для CheChe
 
Регистрация: 25.06.2015
Сообщений: 11
Вопрос Проблемы с кириллицей, Delphi XE

Пишу приложение, которое сидит в фоне и в случае набора на клавиатуре каких-то определенных слов делает какие-то действия.
Ниже приведен код функции, которая возвращает нажатую кнопку.
Проблема в том, что если скомпилировать проект на Delphi XE, то на не русифицированной ОС эта функция возвращает кириллицу некорректно. Что странно, ведь если этот же проект скомпилировать в Delphi 7, то всё работает как надо. Помогите, пожалуйста, исправить эту функцию для Delphi XE.


Код:
function GetChar(LParam: Integer): AnsiString;
 var
   KeyState: TKeyboardState;
   RetCode: Integer;
   ID: DWORD;
   L: HKL;
   vkCode: DWORD;
   scanCode: DWORD;
 begin
  Result:= '';
  with PKbDllHookStruct(LParam)^ do
  begin
   case vkCode of
    VK_BACK:     Result:= ' [BackSpace] ';
    VK_RETURN:   Result:= ' [Enter] ';
    VK_SHIFT:    Result:= '[Shift]';
    VK_ESCAPE:   Result:= ' [Esc] ';
    VK_F1:       Result:= ' [F1] ';
    VK_F2:       Result:= ' [F2] ';
    VK_F3:       Result:= ' [F3] ';
    VK_MENU:     Result:= ' [Alt] ';
   else
    ID:= GetWindowThreadProcessId(GetForegroundWindow);
    GetKeyboardState(KeyState);
    SetLength(Result, 2);
    L:= GetKeyboardLayout(ID);
    RetCode:=  ToAsciiEx(vkCode, scanCode, KeyState, PChar(PAnsiChar(Result)), 0, L);
    if RetCode = 1 then
    begin
     if Result[1] < ' '
     then Result:=  AnsiString(Format(' [Ctrl+%s] ', [Chr(Ord(Result[1]) + Ord('@'))]))
     else SetLength(Result, 1);
    end
    else Result:= '';
   end;
  end;
 end;
CheChe вне форума Ответить с цитированием
Старый 25.06.2015, 11:37   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
PChar(PAnsiChar(Result)
Это для чего?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.06.2015, 11:49   #3
CheChe
Пользователь
 
Аватар для CheChe
 
Регистрация: 25.06.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это для чего?
Это копипаст из интернета. Повторюсь, всё работает если скомпилить в Delphi 7
Пробовал такие варианты, но безрезультатно:
Код:
PChar(Result)
PWideChar(Result)
PWChar(Result)
Пробовал заменить ToAsciiEx на ToUnicode, но тоже не сработало, пустую строку возвращает
CheChe вне форума Ответить с цитированием
Старый 25.06.2015, 11:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А как эта функция внутри выглядит?
Ты должен понимать, что ХЕ - юникодные, а Д7 - нет
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.06.2015, 12:01   #5
CheChe
Пользователь
 
Аватар для CheChe
 
Регистрация: 25.06.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А как эта функция внутри выглядит?
Какая? ToAsciiEx и ToUnicode - это стандартные функции из модуля Windows.pas

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ты должен понимать, что ХЕ - юникодные, а Д7 - нет
Понимаю. А что нужно исправить - нет )
CheChe вне форума Ответить с цитированием
Старый 25.06.2015, 13:29   #6
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от CheChe Посмотреть сообщение
Понимаю. А что нужно исправить - нет )
Оставляю в качестве домашнего задания. Рано или поздно нужно переставать быть начинающим, а для этого надо прикладывать самостоятельные усилия. Задача элементарнейшая -- нужно лишь согласованно поменять типы.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 25.06.2015, 14:36   #7
CheChe
Пользователь
 
Аватар для CheChe
 
Регистрация: 25.06.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Оставляю в качестве домашнего задания. Рано или поздно нужно переставать быть начинающим, а для этого надо прикладывать самостоятельные усилия. Задача элементарнейшая -- нужно лишь согласованно поменять типы.
Да я что только не перепробовал и уже совсем запутался
CheChe вне форума Ответить с цитированием
Старый 25.06.2015, 15:41   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

PAnsiChar туда передавать скорее всего не нужно. И вообще работать с String а не Ansistring, ИМХО.
А вообще это вопрос еще где ты кракозябры эти наблюдаешь потом, может коды как раз приходят верные, а вот их отображение требует конвертации.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.06.2015, 18:50   #9
CheChe
Пользователь
 
Аватар для CheChe
 
Регистрация: 25.06.2015
Сообщений: 11
По умолчанию

поэкспериментировал с функцией ToUnicodeEx и всё заработало
CheChe вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с кириллицей и символами в ссылках Ship_1 Общие вопросы Delphi 7 13.08.2014 21:32
Глюк с кириллицей на BUTTONах vpm Microsoft Office Excel 12 03.12.2012 15:11
Нумерация приложений кириллицей BlackWizard0 Microsoft Office Word 0 22.02.2012 14:06
Всё та же проблема с кириллицей в БД Prok186 БД в Delphi 0 01.11.2011 09:36
не могу написать кириллицей Алёна БД в Delphi 0 28.05.2007 14:04