Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 11.10.2008, 01:20   #1
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
Репутация: 48
По умолчанию Иммитация нажатий клавиш клавиатуры

Здравствуйте.
Есть два вопроса:
1) Как программно считать последовательное нажатие определеных клавиш? Например пользователь нажимает клавиши [Y],[E],[S], только после этого программа выдает какое-то действие.
2) У каждой клавиши есть свой код. Например, клавише [1!] соответствует код $31. Чтобы имитировать нажатие этой клавиши, использую ф-цию SetKey. Но под одним кодом находятся два символа 1 и !. Как сделать имитацию нажатия этой клавиши так, чтобы в текстовом поле (вне программы) выводился символ !, а не 1?

Заранее благодарен.
chandrasecar вне форума   Ответить с цитированием
Старый 11.10.2008, 01:26   #2
mihali4
*
Профессионал
 
Регистрация: 22.11.2006
Адрес: Москва
Сообщений: 9,198
Репутация: 2661
По умолчанию

1. Накапливать нажатия в строковой переменной (строке). При вводе каждого символа проверять, соответствует ли введенная подстрока началу эталона. Если нет - сброс в пустую строку с выдачей сообщения, если нужно.
2. А что вы делаете, когда вводите "!" руками? Верно, нажимаете еще и Shift. Вот и тут нужно указать Shift:=[ssShift].
SetKey, SetKey... Но ведь это функция для работы с датасетами...
Вообще-то, для текстового поля, например, эдита, можно сделать вот так:
Edit1.Perform(WM_Char,Ord('!'),0);

Последний раз редактировалось mihali4; 11.10.2008 в 01:46.
mihali4 вне форума   Ответить с цитированием
Старый 11.10.2008, 09:45   #3
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
Репутация: 48
По умолчанию

Для Эдита можно и так. Но моя программа сама печатает с сторонних приложениях, например в Ворде, поэтому и SetKey. Только как через эту функцию одновременно нажать и [Шифт] и [1]?
chandrasecar вне форума   Ответить с цитированием
Старый 11.10.2008, 11:35   #4
mihali4
*
Профессионал
 
Регистрация: 22.11.2006
Адрес: Москва
Сообщений: 9,198
Репутация: 2661
По умолчанию

Если бы вы действительно имитировали нажатия клавиш (с их опусканием невидимым пальцем и последующим отпусканием) - я бы вас понял...
Но вам-то нужно передать не комбинацию кодов клавиш, а код символа!
И хватит разыгрывать из себя Джеймса Бонда. Приведите ваш код, в котором у вас "затыки", и вам быстрее помогут...
mihali4 вне форума   Ответить с цитированием
Старый 11.10.2008, 12:02   #5
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
Репутация: 48
По умолчанию

Код значит такой:

Код:

private
    klav, klav1: Integer;
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
    procedure SetKey(Key:Integer);
..........................
procedure TForm1.SetKey(Key:Integer);
begin
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
if Timer1.Enabled=False then begin
  SetLayoutActiveWnd(ENGLISH);
  i:=0;
  if Msg.HotKey = klav then Timer1.Enabled:=True;
  if Msg.HotKey = klav1 then Timer1.Enabled:=True;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
const
     vk_Delete    = $2E;
     vk_Back      = $08;
begin
  ShowWindow(Application.Handle,SW_Hide); // скрытие формы
  ShowWindow(handle,sw_hide);

  klav := GlobalAddAtom('Hotkey4');
  RegisterHotKey(Handle, klav, 0, vk_Delete );

  klav1 := GlobalAddAtom('Hotkey3');
  RegisterHotKey(Handle, klav1, 0, vk_Back );

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

  UnRegisterHotKey(Handle, klav);
  GlobalDeleteAtom(klav);
  UnRegisterHotKey(Handle, klav1);
  GlobalDeleteAtom(klav1);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  ShowWindow(Application.Handle,SW_Hide); // скрытие формы
  ShowWindow(handle,sw_hide);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
const
  VK_H = $48;  VK_N = $4E;
  VK_E = $45;  VK_Sh = $31;
  VK_L = $4C;
  VK_O = $4F;
begin
i:=i+1;
if i=1 then SetKey(VK_Space);
if i=2 then begin SetKey(VK_H); end;
if i=3 then begin SetKey(VK_E); end;
if i=4 then SetKey(VK_L);
if i=5 then SetKey(VK_L);
if i=6 then SetKey(VK_O); 
if i=7 then SetKey(VK_Space);
if i=8 then SetKey(VK_N);
if i=9 then SetKey(VK_E);
if i=10 then SetKey(VK_O);
if i=11 then SetKey(VK_Sh-2);
if i=11 then Timer1.Enabled:=False;
end;

Смысл программы: Пользователь работает в ворде, нажимает Del или Backspace, программа сама печатает в ворде сообщение 'Hello neo'. Вот отсюда и вопрос: каждая клавиша содержит максимум 2 символа, один из которых можно получить только при нажатии SHIFT, как этот символ получить при программной имитации нажатия клавиши?
Или может это можно сделать как-то иначе?
chandrasecar вне форума   Ответить с цитированием
Старый 11.10.2008, 12:16   #6
mihali4
*
Профессионал
 
Регистрация: 22.11.2006
Адрес: Москва
Сообщений: 9,198
Репутация: 2661
По умолчанию

Как же вы все (без исключения!) не любите или просто не умеете пользоваться поиском по форуму!
Посмотрите вот эту тему, она как раз для вас:
http://www.programmersforum.ru/showt...F1%EB%E0%F2%FC
mihali4 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СЧЁТЧИК НАЖАТИЙ НА КНОПКУ Saydan Microsoft Office Access 8 24.06.2008 21:39
отслеживание нажатий клавиш Артэс Win Api 6 14.06.2008 20:02
Borland C, перхват нажатий стрелок Arion Помощь студентам 3 30.04.2008 12:33
Пытаюсь написать прогу которая перехватывает нажатия клавиш клавиатуры и записует в текстовый файл, но evg_reg35 Общие вопросы Delphi 42 05.04.2008 13:44
как после определенного просчета, при нажатий флажка, результат записался там навечно Илюха1 Microsoft Office Excel 3 07.11.2007 21:01


01:24.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru