Разработка программного обеспечения для различных операционных систем требует внимания к деталям, особенно когда речь идет о совместимости кода. В случае с Delphi и Pascal, разработчики часто сталкиваются с особенностями работы в 32-битной и 64-битной версиях Windows. В данном руководстве мы рассмотрим, как правильно отправлять расширенные символы ASCII (0x80 до 0xFF) в 64-битной Windows с использованием Delphi.
Проблема
Разработчик сталкивается с проблемой, что отправка расширенных символов ASCII через PostMessage в 64-битной Windows не работает, в то время как в 32-битной всё функционировало корректно. Это связано с изменением типа LPARAM в 64-битной версии Windows, который теперь имеет 64 бита, вместо 32 бит, как в 32-битной версии.
Решение
Для решения проблемы необходимо использовать тип LPARAM вместо LongInt в функции ConstructLParam, или же использовать функцию MAKELPARAM, которая корректно обрабатывает типы данных в 64-битной системе.
Пример кода
function ConstructLParam(vKey: Word): LPARAM;
begin
if vKey > $FF then
Result := MAKELPARAM(MapVirtualKeyW(vKey, 0) and $00000FFF, 0) or $F0000000
else
Result := MAKELPARAM(MapVirtualKey(vKey, 0) and $000000FF, 0) shl 16;
end;
procedure PostCharacter(TargetWinHandle: HWND; UniCodeValue: Word; IME_MSG, WideFunction, SimulateKey, SendMSG: Boolean);
begin
// ... (остальная часть кода процедуры)
if SendMSG then
// ... (условные операторы для отправки сообщений)
else
// ... (условные операторы для отправки сообщений с помощью PostMessage)
if WideFunction then
PostMessageW(TargetWinHandle, WM_KEYDOWN, MakeWParam(UniCodeValue, 0), ConstructLParam(UniCodeValue));
PostMessageW(TargetWinHandle, WM_CHAR, MakeWParam(UniCodeValue, 0), ConstructLParam(UniCodeValue));
if SimulateKey then
PostMessageW(TargetWinHandle, WM_KEYUP, MakeWParam(UniCodeValue, 0), ConstructLParam(UniCodeValue) or $C0000000);
// ... (остальная часть процедуры)
end;
Важные замечания
Используйте LPARAM вместо LongInt для обеспечения совместимости с 64-битной Windows.
Рассмотрите возможность использования SendInput вместо PostMessage для более корректной симуляции ввода.
В современном программировании рекомендуется использовать Unicode вместо ANSI.
Альтернативные подходы
Использование SendInput вместо PostMessage может быть более предпочтительным решением для симуляции ввода.
Рассмотрите возможность автоматизации вместо симуляции ввода, если это возможно в контексте вашего приложения.
Не забывайте о дебаггинге вашего кода, так как это ключевой навык для любого программиста.
Заключение
Приведенные выше изменения должны помочь вам решить проблему с отправкой расширенных символов ASCII в 64-битной Windows через Delphi. Важно помнить о совместимости типов данных и использовать подходящие функции для работы в 64-битной среде.
Разработчик сталкивается с проблемой совместимости кода при работе с расширенными символами ASCII в 64-битной версии Windows с использованием Delphi и ищет решение для корректной отправки сообщений.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.