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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 16.06.2008, 22:24   #1
Air
Участник клуба Подтвердите свой е-майл
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,297
Сообщение Имитация нажатия клавиш

У меня вопрос.
Высмотрел в модуле "Windows" следующее:
Код:
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
Почему когда я делаю так
Код:
keybd_event($41,0, 0, 0);
имитируется нажатие клавиши "а" вместо "А"?

И как вообще заставить "нажаться клавишу" проше:
Код:
keybd_event(ord('А'),0, 0, 0);
Результат "А" (но получится "а")
Код:
keybd_event(ord('b'),0, 0, 0);
Результат "b" (а не что-то левое) ?

Благодарю за внимание.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 16.06.2008, 22:39   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Почему когда я делаю так
Код:
keybd_event($41,0, 0, 0);
имитируется нажатие клавиши "а" вместо "А"?
Очевидно потому, что не "зажат" Caps Lock. keybd_event буквально "нажимает" клавишу, не более того. Будет включена русская раскладка клавиатуры - значит пойдёт кириллица.
B_N вне форума Ответить с цитированием
Старый 16.06.2008, 22:42   #3
Air
Участник клуба Подтвердите свой е-майл
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,297
По умолчанию

А не подскажете как программно на момент "нажатия" включить Caps Lock (и соответственно выключить)?
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 16.06.2008, 22:47   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
А не подскажете как программно на момент "нажатия" включить Caps Lock (и соответственно выключить)?
Тоже с помощью keybd_event ! Через сканкод VK_CAPITAL - нажать/отпустить. Но вообще, всё зависит от того, что Вы делаете. Может ведь вполне хватить WM_CHAR, например.
B_N вне форума Ответить с цитированием
Старый 16.06.2008, 22:51   #5
Air
Участник клуба Подтвердите свой е-майл
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,297
По умолчанию

Цитата:
Но вообще, всё зависит от того, что Вы делаете.
В моей программе реализована процедура запуска от другого пользователя.
Я использую системную утилиту "RunAs.exe" после чего она требует ввести пароль (всё бы ничего), но вводить пароль с клавы нельзя (другие пользователи могут спалить), поэтому мне нужно программно ввести пароль.
Вот моя задача.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 16.06.2008, 22:58   #6
Air
Участник клуба Подтвердите свой е-майл
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,297
По умолчанию

Дык, а не отжимается Caps Lock, так же и VK_SHIFT, только после того как на клаве нажму. Что не так?
P.S.
Дошло
Код:
keybd_event(VK_SHIFT,0, KEYEVENTF_KEYUP, 0);
Всё гениальное - просто!

Последний раз редактировалось Air; 16.06.2008 в 23:03.
Air вне форума Ответить с цитированием
Старый 16.06.2008, 23:04   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Дык, а не отжимается Caps Lock, так же и VK_SHIFT, только после того как на клаве нажму. Что не так?
Код:
	keybd_event(VK_CAPITAL,0, 0, 0);
	keybd_event(VK_CAPITAL,0, KEYEVENTF_KEYUP, 0);
	keybd_event('A',0, 0, 0);
	keybd_event(VK_CAPITAL,0, 0, 0);
	keybd_event(VK_CAPITAL,0, KEYEVENTF_KEYUP, 0);
А запустить процесс под другим именем вполне можно (и лучше) через CreateProcessWithLogonW.
B_N вне форума Ответить с цитированием
Старый 16.06.2008, 23:07   #8
Air
Участник клуба Подтвердите свой е-майл
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,297
По умолчанию

Код:
BOOL WINAPI CreateProcessWithLogonW(
  __in         LPCWSTR lpUsername,
  __in_opt     LPCWSTR lpDomain,
  __in         LPCWSTR lpPassword,
  __in         DWORD dwLogonFlags,  // здесь я не знаю что писать
  __in_opt     LPCWSTR lpApplicationName,
  __inout_opt  LPWSTR lpCommandLine,
  __in         DWORD dwCreationFlags, // здесь я не знаю что писать
  __in_opt     LPVOID lpEnvironment, // здесь я не знаю что писать
  __in_opt     LPCWSTR lpCurrentDirectory,
  __in         LPSTARTUPINFOW lpStartupInfo, // здесь я не знаю что писать
  __out        LPPROCESS_INFORMATION lpProcessInfo // здесь я не знаю что писать
);
Спасибо за подсказку, что-нибудь придумаю.
Всё гениальное - просто!

Последний раз редактировалось Viteef; 16.06.2008 в 23:19.
Air вне форума Ответить с цитированием
Старый 16.06.2008, 23:24   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Air, параметры, начиная с пятого, аналогичны параметрам CreateProcess и dwCreationFlags, lpEnvironment, lpCurrentDirectory и lpCurrentDirectory можно вообще оставлять нулевыми, только передавать двумя последними параметрами адреса соответствующих структур, примеры на форуме Вы наверняка видели. А dwLogonFlags - LOGON_WITH_PROFILE для загрузки профиля учётной записи, если он нужен, или LOGON_NETCREDENTIALS_ONLY для сетевого входа, по большому счёту его тоже можно оставить нулевым, всё зависит от целей
B_N вне форума Ответить с цитированием
Старый 16.06.2008, 23:29   #10
Air
Участник клуба Подтвердите свой е-майл
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,297
По умолчанию

Благодарю Вас.

Выкладываю свои наработки, вроде как всё работает.

Код:
uses JwaWinBase;

...

procedure TForm1.Button1Click(Sender: TObject);
 var
    si: STARTUPINFOW;
    pif: PROCESS_INFORMATION;
    res: Bool;
   s: string;
 begin
  si.cb := SizeOf(startupinfow);
   si.dwFlags  := STARTF_USESHOWWINDOW;
   si.wShowWindow := SW_SHOWDEFAULT;
   si.lpReserved := nil;
   si.lpDesktop := nil;
   si.lpTitle := 'Konsole';

  res := CreateProcessWithLogonW('Администратор', 'Wiktor', '123', LOGON_WITH_PROFILE,
     'c:\123.exe', nil
     , CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pif);
   if booltostr(res) = '0' then
    begin

  //  str(GetLastError, s); тут правда не до понял...
     ShowMessage('CreateProcessWithLogonResult: ' + booltostr(res) + #10 +
       'GetLastError: ' + s);
   end;
end;
И модули. С ними вообще проблема была, кое как нашёл.
jwantstatus.pas
jwawinbase.pas
jwawingdi.pas
jwawinnt.pas
jwawintype.pas
jwawinuser.pas
jwawinwlx.pas

особенно jwawinbase.pas
Вложения
Тип файла: zip JEDI.zip (326.3 Кб, 84 просмотров)
Всё гениальное - просто!

Последний раз редактировалось Air; 17.06.2008 в 02:07.
Air вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эмуляция нажатия нескольких клавиш -=Shad0www Общие вопросы Delphi 3 12.05.2008 08:13
Имитация нажатия комбинации клавиш Zeraim Win Api 15 05.05.2008 20:35
Как заставить программу реагтровать на нажатия клавиш? AngelOfDeath Общие вопросы Delphi 9 07.04.2008 23:58
Проверка нажатия клавиш в компоненте Мемо|Delphi GAGARIN-NEW Помощь студентам 4 09.12.2007 20:59
программа по эмуляции нажатия клавиш sr_lexx Win Api 3 03.12.2007 16:40