Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  06:56[Войти] | [Зарегистрироваться]
Ответ на вопрос № 4909

04-01-2001 12:11
Проблема стоит такая - надо проэмулировать нажатия в
ДРУГОМ ПРИЛОЖЕНИИ
(handle известен).
Но не одиночных, а двойных (Shift+Insert или Ctrl+V,
например, я из
Clipboard-а вставляю информацию). Так вот, решение "в лоб"
через
postmessage не дает результатов - "функциональная" клавиша
не удерживается
:-(



пишу так:

--
postmessage(hndl,WM_KEYDOWN,VK_CONTROL,1075642500);
postmessage(hndl,WM_KEYDOWN,86{VK_V},3080193);
--


"страшные" цифры в конце взяты из документации к WinAPI.
Различные
модификации 4-го параметра не помогают.
Если кто-то обладает готовым работающим решением, или
знает, как
"удержать" Shift (или CTRL), подскажите, пожалуйста!

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

11-12-2003 03:26
ВОПРОС: КАК ПОСЛАТЬ ПРОГРАММЕ КОМБИНАЦИЮ КЛАВИШ,
НАПРИМЕР "CTRL+F"? ОТВЕТ: ДЕЛАЕМ СЛЕДУЮЩЕЕ:

01) Запустить WinSight;
02) Зайти в его настройки: Меню "Messages" --> "Options" ...;
03) В окне настроек ВКЛючить галочку "Interpret Values", а "HEX Values" - ВЫКЛючить. Нажать OK!;
04) Запустить программу-"пациента", которой мы хотим посылать комбинацию клавиш;
05) Выбрать в дереве процессов WinSight эту программу-"пациента" и тот ее объект, которому надо "посылать";
06) Включить WinSight в режим слежения: "Start!" и переключиться на программу-"пациента";
07) Активировать (если надо) нужный объект щелчком мыши и нажать требуемую комбинацию клавиш;
08) Должна выполниться та функция программы-"пациента", вызов которой мы хотим эмулировать программно;
09) Закрываем программу-"пациента" (не обязательно, можно свернуть ;-);
10) Переходим к WinSight и смотрим, какие сообщения он у нас поймал;
11) Если ничего нет (или нет того, что нужно), значит вы выбрали не тот процесс или объект программы.
      Коли так, возвращайтесь к пункту 4 и делайте заново... Удачи...;
12) Если вы все-таки получили "какие то" сообщения и среди них попадаются слова WM_KEYDOWN,
      значит, возможно, это то, что нужно... ;-);
13) Выбираем (визуально) участок сообщений, в котором содержатся сообщения WM_KEYDOWN
      и/или WM_KEYUP.  Например:

    000160:00000710 {Internet Ex}  WM_TIMER Dispatched  id 4096  lpfn 00000000
    000161:00000710 {Internet Ex}  WM_NCHITTEST Sent  (236,258)
+  000162:00000710 {Internet Ex}  WM_KEYDOWN Dispatched  11h  17d  VK_CONTROL  Scan 1Dh  Down
    000163:00000710 {Internet Ex}  WM_NCHITTEST Sent  (236,258)
+  000164:00000710 {Internet Ex}  WM_KEYDOWN Dispatched  46h  70d  VK_F  Scan 21h  Down
+  000165:00000710 {Internet Ex}  WM_COMMAND Sent  Accelerator  0043h  67d
+  000166:00000710 {Internet Ex}  WM_KEYUP Dispatched  46h  70d  VK_F  Scan 21h  Up
    000167:00000710 {Internet Ex}  WM_TIMER Dispatched  id 4096  lpfn 00000000
    000168:00000710 {Internet Ex}  wm_systimer Dispatched  wp=0000FFFF  lp=177F12DC

// Плюсами я мысленно пометил те сообщения, которые нужны (в моем случае) для эмуляции нажатия.

14) Отделите (мысленно) "мусор" от "нормальных", нужных  сообщений (чтобы выбрать, можно прогнать
      процесс отслеживания сообщений несколько раз и сравнить полученные результаты)
15) Допустим Вы получили список "нужных" сообщений, повторяющихся всегда при нажатии комбинации:

000162:00000710 {Internet Ex}  WM_KEYDOWN Dispatched  11h  17d  VK_CONTROL  Scan 1Dh  Down
000164:00000710 {Internet Ex}  WM_KEYDOWN Dispatched  46h  70d  VK_F  Scan 21h  Down
000165:00000710 {Internet Ex}  WM_COMMAND Sent  Accelerator  0043h  67d
000166:00000710 {Internet Ex}  WM_KEYUP Dispatched  46h  70d  VK_F  Scan 21h  Up

16) Далее, нужно зайти в настройки WinSight: Меню "Messages" --> "Options" ...
17) В окне настроек ВЫКЛючить галочку "Interpret Values", а "HEX Values" - ВКЛючить. Нажать OK! ;-)
      Ваши сообщения преобразуются в несколько другой вид:

000162:00000710 {Internet Ex}  WM_KEYDOWN (10004X) Dispatched  wp=00000011 lp=001D0001
000164:00000710 {Internet Ex}  WM_KEYDOWN (10004X) Dispatched  wp=00000046 lp=00210001
000165:00000710 {Internet Ex}  WM_COMMAND (11104X)  Sent wp=00010043 lp=00000000
000166:00000710 {Internet Ex}  WM_KEYUP (10104X) Dispatched  wp=00000046 lp=C0210001

18) А вот это, девочки и мальчики - уже и есть готовые команды! Надо только переписать в Дельфю!
19) Преобразуем в нормальный Дельфевый вид:

// Эмуляция нажатия CTRL+F. ( HWND - соответственно хендл объекта, которому будем посылать комбинацию)
// PostMessage применяется, если сообщение Dispatched (см. выше - перехваченные сообщения)
// SendMessage применяется, если сообщение Sent  (см. выше - перехваченные сообщения)

PostMessage(HWND, WM_KEYDOWN, $00000011, $001D0001); // Эмулирует нажатие и задержку CTRL (Код-&H11)
PostMessage(HWND, WM_KEYDOWN, $00000046, $00210001); // Эмулирует нажатие клавиши F (Код-&H46)
SendMessage(HWND, WM_KEYDOWN, $00010043, $00000000); // Акселератор
PostMessage(HWND, WM_KEYUP, $00000046, $C0210001); // Эмулирует отпускание клавиши F  (Код-&H46)

20) Вот собственно и все! Компилируйте, запускайте свою прогу, запускайте программу-"пациента" и проверяйте!
      Если не работает, значит вы чего то не учли... Попробуйте еще поискать WinSight'ом... А у меня все работает!

Best Regards...
-=BioHazard=-


04-01-2001 22:22 | Сообщение от автора вопроса
Увы, с примером из PBuilder-a - также полный облом (хотя странно это). Т.е. Ctrl упорно не хочет нажиматься.

04-01-2001 19:27
В модуле SysUtils есть готовые функции преобразования KeyDataToShiftState и обратно.

04-01-2001 19:18
Вот примерчик, который наверное вам подойдет.
(Взят из RBuilder)
procedure TppDesignerWindow.FileSaveFormClick(Sender: TObject);
var
  lHandle  : THandle;
  lCtrlKey : TKeyData;
  lSKey    : TKeyData;
begin

  {build control key data rec}
  lCtrlKey.RepeatCount := 1;
  lCtrlKey.ScanCode    := MapVirtualKey(VK_CONTROL, 0);
  lCtrlKey.Flags      := 0;

  {build 'S' key data rec}
  lSKey.RepeatCount := 1;
  lSKey.ScanCode    := MapVirtualKey(Ord('S'), 0);
  lSKey.Flags      := 0;

{send Ctrl + S key stroke combo to delphi }
lHandle := FindWindow('TAppBuilder', nil);

if (lHandle > 0) then
  begin
    PostMessage(lHandle, WM_KEYDOWN, VK_CONTROL, LongInt(lCtrlKey));
    PostMessage(lHandle, WM_KEYDOWN, Ord('S'), LongInt(lSKey));
  end;

end;

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Зимой — белый, летом — серый. Кто?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования