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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2007, 17:25   #11
Hintman
Пользователь
 
Регистрация: 14.04.2007
Сообщений: 28
По умолчанию

Уточнение: до начала этого цикла repeat...until не использовались никакие функции типа SetKeyboardState, GetKeyboardState и т.п.

И еще: насчет приведенного кода который вроде бы некорректный (но ведь работает):
как видно, 1-й параметр здесь для всех символов постоянный - это 17,
а 2-й параметр - изменяется, и соответственно ему выводятся последовательно символы x,c,v,b,n и т.д.

Значит 2-й параметр, получается, отвечает за виртуальный код клавиши,
а ведь в описании функции - это должен быть 1-й параметр.
Не понимаю... Дельфи что ли с ума сошёл, али че?

Последний раз редактировалось Hintman; 23.08.2007 в 17:31.
Hintman вне форума Ответить с цитированием
Старый 23.08.2007, 18:30   #12
Hintman
Пользователь
 
Регистрация: 14.04.2007
Сообщений: 28
По умолчанию

На форму бросил Edit и написал такую процедуру:

Код:
procedure TForm1.FormClick(Sender: TObject);
begin
  keybd_event(Ord('S'), 0, 0, 0);
  sleep(50);
  keybd_event(Ord('S'), 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
Действительно, нажимается клавиша 's' (символ отображается в Edit),
причем в маленьком регистре, как писал still_alive.
Не совсем понятно, как из 'S' стало 's', но это не столь существенно.

А вот теперь то, что требуется: требуется нажать 's' в чужом окне.
Код такой:

Код:
procedure TFMain.SB_NextClick(Sender: TObject);
var
H : HWND;
begin
  H:=FindWindow(nil,PChar(CB_HV.Text));

  if H=0 then begin
    ShowMessage('Window not found!');
    Exit;
    end;

  SetForegroundWindow(H);

  keybd_event(Ord('S'), 0, 0, 0);
  sleep(50);
  keybd_event(Ord('S'), 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);

end;
И вот здесь, почему-то, 's' не нажимается.

Прошу помощи.
Hintman вне форума Ответить с цитированием
Старый 23.08.2007, 18:55   #13
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Не совсем понятно, как из 'S' стало 's', но это не столь существенно.
Просто виртуальные коды символьных клавиш совпадают с ASCII кодами ЗАГЛАВНЫХ букв. И для виртуальных кодов все равно какой регистр и какая раскладка. Если английская - нажмется s, если еще включен CapsLock - то S. Аналогично и с русской.

PS A зачем KEYEVENTF_EXTENDEDKEY? Это для расширенных клавиш.
Кроме этого, в коде ошибок не вижу, покажи обработчик другой проги, если твоя или посмотри на раскладку в той проге и на фокус...
still_alive вне форума Ответить с цитированием
Старый 23.08.2007, 18:57   #14
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

И слип убери, зачем он?
still_alive вне форума Ответить с цитированием
Старый 23.08.2007, 19:08   #15
Hintman
Пользователь
 
Регистрация: 14.04.2007
Сообщений: 28
По умолчанию

Спасибо за ответ.

KEYEVENTF_EXTENDEDKEY и Sleep действительно не нужно использовать,
просто я и так делал, и так - ну никак не работает.

По вопросам:

1) Прога в которую нужно осуществить ввод не моя.

2) "Посмотри на раскладку в той проге и на фокус."
C раскладкой и фокусом в той проге все нормально, это точно.
И у меня получается туда вводить символы, но каким-то странным образом.

А именно: ничего не происходит когда я пишу
Код:
keybd_event(Ord('S'), 0, 0, 0);
keybd_event(Ord('S'), 0, KEYEVENTF_KEYUP, 0);
Зато 's' прекрасно нажимается когда я пишу
Код:
keybd_event(0, 31, 0, 0);
keybd_event(0, 31, KEYEVENTF_KEYUP, 0);
Как будто глюк какой-то, ну как так может быть?
Что еще мне подсказать, чтобы прояснить ситуацию?
Hintman вне форума Ответить с цитированием
Старый 23.08.2007, 19:21   #16
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

хз, второй параметр, как написано в хелпе, вообще не используется, ибо это скан-код, который можно из виртуального кода получить. Первое по-любому должно работать, имхо.
Что еще могу сказать... ну попробуй SendInput. Надеюсь, англ знаешь? Тогда в хелп.
still_alive вне форума Ответить с цитированием
Старый 23.08.2007, 19:50   #17
Hintman
Пользователь
 
Регистрация: 14.04.2007
Сообщений: 28
По умолчанию

still_alive, огромное спасибо!!!
Все получилось! Вот код, может кому пригодится:

Код:
procedure PostKeyboardEvent(KeyKode,State : integer);
var
Temp : TInput;
begin
Temp.IType:=INPUT_KEYBOARD;
Temp.ki.time:=0;
Temp.ki.dwExtraInfo:=cardinal(nil);
Temp.ki.wVk:=KeyKode and $FF;
Temp.ki.wScan:=MapVirtualKey(KeyKode, 0) and $FF;
Temp.ki.dwFlags:=STATE;
SendInput(1,Temp,SizeOf(Temp));
end;
Теперь моя программа будет работать, но вопрос насчет глюков
при использовании keybd_event, SendMessage остался открытым...
Hintman вне форума Ответить с цитированием
Старый 23.08.2007, 19:53   #18
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
still_alive, огромное спасибо!!!
Да не за что, я всегда рад поговорить с понятливым человеком
still_alive вне форума Ответить с цитированием
Старый 01.11.2007, 01:25   #19
grio
Новичок
Джуниор
 
Регистрация: 31.10.2007
Сообщений: 2
По умолчанию

Действительно работает, спасибо за код!
Затрудняюсь передать этим способом клавишу с модификатором Shift. Как реализовать?
grio вне форума Ответить с цитированием
Старый 01.11.2007, 02:12   #20
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от grio Посмотреть сообщение
Действительно работает, спасибо за код!
Затрудняюсь передать этим способом клавишу с модификатором Shift. Как реализовать?
См. функции GetKeyboardState и SetKeyboardState.
mihali4 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция Tregistry.keyexists не работает Ozerich Общие вопросы Delphi 5 18.09.2008 09:42
Не работает функция gets()!!! Ilya'91 Общие вопросы C/C++ 1 28.07.2008 23:16
Не работает функция floor в Java POPOV Помощь студентам 1 24.04.2008 14:08
keybd_event [Smarik] Win Api 1 23.03.2008 18:11
не корректно работает функция "если" (+) zetrix Microsoft Office Excel 0 30.10.2006 19:19