Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keybd_event
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - FAQ
Vadik(R)
Не пойму, что за фигня с Делфи твориться! Раньше всегда работал keybd_event, а теперь только цифры. Пишу код
procedure TForm1.Button1Click(Sender: TObject);
begin
  sleep(3000);
  keybd_event(Ord('D'), 0, 0, 0);
  keybd_event(Ord('D'), 0, KEYEVENTF_KEYUP, 0);
end;

За 3 секунды перевожу курсор в блокнот. Пишет не латинскую большую D, а маленькую русскую в.
Раньше все прекрасно работало. Не могли ли повлиять какие-либо из программ на это: Apache, MySQL, php, notepad++, Landscaping & deck designer 7.07a, silverlight, плюс то, что я поставил себе японскую раскладку клавиатуры? Уже два часа долблюсь над проблемой, в Интернете ничего пока не нашел.
Вот, уже кое-что надыбал, но все равно не полное решение моей проблемы:
Цитата
Нет. Все дело в том, что в Windows XP 2008 надо указать какой вид языка посылаешь и какой вид языка у программы которая принимает. т.е. Если принимающая программа имеет язык EN, то посылающая прорамма должна посылать англиские символы при этом изменив язык приложения на EN. И на оборот - если принимающее преложение имеет RU, то посылающая программа должна посылать руские символы при этом изменив язык приложения на RU. И зачем они это сделали ? все было гораздо лучше.

Правда Windows у меня XP SP 2, но уже при посылке большой латинской D печатается маленькая латинская d.
Придумал! Можно включить программно Shift перед этим и потом напечатать. Вот только вопрос: как быть, если в тексте будут и русские символы и английские? Как программно переключить язык?
Вот пока что получилось:
procedure TForm1.Button1Click(Sender: TObject);
const
  rus : Set of Char = ['а'..'я']+['А'..'Я'];
var
  i : Integer;
begin
  for i:=1 to Length(Edit1.Text) do
  begin
    if Edit1.Text[i] in rus then LoadKeyboardLayout('00000419', KLF_ACTIVATE) else LoadKeyboardLayout('00000409', KLF_ACTIVATE);
    keybd_event(Ord(Edit1.Text[i]), 0, 0, 0);
    keybd_event(Ord(Edit1.Text[i]), 0, KEYEVENTF_KEYUP, 0);
  end;
end;

Но все равно не работает. В блокноте опять пишет вместо D маленькую в.
FBUS
гугл те поможет. раскладка клавы переключается одной строчкой. я так делал но не помню точно оператор, ищи.
Vadik(R)
Да то, что он предлагает - это я и так написал (LoadKeyboardLayout('00000419', KLF_ACTIVATE)), но почему-то в моем примере это не работает sad.gif
Yason
Я бы покопал в сторону ]]>WM_INPUTLANGCHANGE]]>.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.