Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Послать VK_Retutn c помощью keybd_event 
:(
    Опции темы
RinOSpro
Дата 1.11.2007, 11:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте помогите пожалуйста. Проблема такая есть edit в чужом приложении туда я посылаю текст и 

должен там нажать enter
вот код 

Код

s := 'Hello';
for j := 1 to Length(s) do
SendMessage(wnd, WM_CHAR, Word(s[j]), 0);

SendMessage(wnd, WM_CHAR, 13, 0);
SendMessage(wnd, WM_CHAR, 10, 0);


В том приложении после нажатия enter происходит действие, но у меня что то не получается этим 

способом. Можно с помощью keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), 0, 0); этот споссоб 

работает но тогда в то приложение отправляется огромное количество этих энтеров. как мне можно сделать 

чтобы заработало? 
  Вверх
Alix
Дата 1.11.2007, 11:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



SendMessage(wnd, WM_KEYDOWM, VK_RETURN, 0); 
SendMessage(wnd, WM_KEYUP, VK_RETURN, 0);
не работает?


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
RinOSpro
Дата 1.11.2007, 12:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Alix  неработает. Я сделал вот как

Код
procedure TForm1.SendKeys(buffer: string; fHandle : HWND);
var i:integer;
   w:word;
   D:DWORD;
   P:^DWORD;
begin
P:=@D;
SystemParametersInfo(                      //get flashing timeout on win98
        SPI_GETFOREGROUNDLOCKTIMEOUT,
        0,
        P,
        0);
SetForeGroundWindow(fHandle);
for i:=1 to length(buffer) do
begin
   w:=VkKeyScan(buffer[i]);
   keybd_event(w,0,0,0);
   keybd_event(w,0,KEYEVENTF_KEYUP,0);
end;
SystemParametersInfo(                     //set flashing TimeOut=0
        SPI_SETFOREGROUNDLOCKTIMEOUT,
        0,
        nil,
        0);
SetForegroundWindow(TWinControl(TComponent(Self).Owner).Handle);
                                           //->typecast working...
SystemParametersInfo(                     //set flashing TimeOut=previous value
        SPI_SETFOREGROUNDLOCKTIMEOUT,
        D,
        nil,
        0);
end;

  Вверх
Alix
Дата 1.11.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



что это?  smile 
специально проверил. Написал для edit'a обработчик onKeyUp, а в другой программе:
Код
var
  wnd : HWND;
  s : string;

begin
  wnd := strtoint(edit1.text);

  s := 'Hello';
  sendmessage(wnd, wm_settext, 0, integer(pchar(s)));

  sendmessage(wnd, wm_keydown, vk_return, 0);
  sendmessage(wnd, wm_keyup, vk_return, 0);
end;

все отлично сработало. Как у тебя сделана реакция на enter для edit'a?


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
RinOSpro
Дата 1.11.2007, 21:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Alix не спорю, обычно работает, но для того приложения, чтото эта штука не работала. Я хз по чему. Если что это приложение ApexDC++
  Вверх
Alix
Дата 1.11.2007, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



у меня нету Apex'a, а ставить не хочу, может быть есть эквивалент в StrongDC? В принципе ифейс то у них одинаковый почти, скажи что за Edit, я проверю.

--
кажется я понял, речь про строку чата? действительно невыходит, ща я его помучаю...

Это сообщение отредактировал(а) Alix - 1.11.2007, 22:45


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Alix
Дата 1.11.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



В общем получилось так (требуется хэндл окна и edit'a)
Код
procedure sendReturn(victimWindow, victimControl : HWND)
var
  myId,
  threadId : DWORD;

begin
  threadId := GetWindowThreadProcessId(victimWindow, nil);
  myId := GetWindowThreadProcessId(form1.Handle, nil);

  if AttachThreadInput(myId, threadId, true) then begin
    windows.SetFocus(victimControl);
    keybd_event(vk_return, mapvirtualkey(vk_return, 0), 0, 0);
    AttachThreadInput(myId, threadId, false);
  end;
end;


Добавлено через 2 минуты и 3 секунды
т.е. перед тем как симулировать нажатие кнопки мне надо установить активный контрол

Это сообщение отредактировал(а) Alix - 1.11.2007, 23:00


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
RinOSpro
Дата 3.11.2007, 12:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Alix  мой пример тоже не плохо работает, там можно посылать к томуже текст, только проблема есть.

,.)(*?:%;№"! - это он не воспринимает и прописные буквы он тоже не воспринимает. Как исправить Помогите.
  Вверх
RinOSpro
Дата 3.11.2007, 13:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот
Код

procedure TForm1.SendKeys(buffer: string; fHandle : HWND);
var
i:integer;
w:word;
D:DWORD;
P:^DWORD;
begin
P:=@D;
SystemParametersInfo(                      //get flashing timeout on win98
        SPI_GETFOREGROUNDLOCKTIMEOUT,
        0,
        P,
        0);
SetForeGroundWindow(fHandle);
for i:=1 to length(buffer)+1 do
begin
if buffer[i]<>#13 then
  SendMessage(fHandle, WM_CHAR, ord(buffer[i]), 0)
  else begin
    w := VkKeyScan(buffer[i]);
    keybd_event(w,0,0,0);
    keybd_event(w,0,KEYEVENTF_KEYUP,0);
  end; 

end;
SystemParametersInfo(                     //set flashing TimeOut=0
        SPI_SETFOREGROUNDLOCKTIMEOUT,
        0,
        nil,
        0);
SetForegroundWindow(TWinControl(TComponent(Self).Owner).Handle);
                                           //->typecast working...
SystemParametersInfo(                     //set flashing TimeOut=previous value
        SPI_SETFOREGROUNDLOCKTIMEOUT,
        D,
        nil,
        0);
end;


  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.