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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по SendMessage, как юзать SendMessage или keybdevent 
:(
    Опции темы
Шурик
Дата 30.10.2002, 16:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Доброе время суток !
Помогите плиз кто могёт !!!
У меня такая проблема: где только я ни искал как послать приложению нажатия клавиш, ничего путного, т.е. что-бы ето действительно работало - я не нашел.
пробовал SendMessage
пробовал keybd_event (Проверял все ето дело на блокноте)
Но послать могу только VK_RETURN (ENTER) и все ... все остальное, что я посылаю - игнорируется.
А вообще проблема в том, что есть одна программулина которая требует при запуске имя и пароль, но мне надо чтоб она на серваке работала днем и ночью - и если комп перезагрузится (мало ли что), то чтобы она сама запустилась.
Вот и решил я написать прогу - которая бы при старте компа сама за меня логинилась.
Я связался с разработчиками - обещали сделать, но когда ......
а мне срочно надо ... помогите кто чем может ...
  Вверх
Song
Дата 30.10.2002, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Ваша проблема в неправильном определении дискриптора, куда Вы через SendMessage() посылаете сообщение.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Шурик
Дата 30.10.2002, 17:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Если бы проблема была в дескрипторе, то у меня и VK_RETURN не посылался бы(наверное:)), а делаю я примерно так:
TheHandle:=FindWindow(nil,'Безымянный - Блокнот');
А потом работаю с етим Handl'ом через SendMessage.
А keybd_event - просто активному окну посылает, как я понял.
Но в любом случае не прокатывает.
Я где то видел, в каком-то форуме кажется, что надо посылать ещё и именно в редактируемое окно, но там етот вопрос так и не был до конца освещен.
Если знаете, то может просто кусок кода покажете, плиз ?
  Вверх
Шурик
Дата 30.10.2002, 18:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











У меня все заработало, спасибо за внимание.
Просто параметры функции keybd_event не были правильно описаны,  они везде так описаны, видимо их испытывали только на VK_RETURN :))))Потому и работает только на системных клавишах.
Если кому интересно - Вырезка из oдного FAQ (http://faqs.org.ru/progr/pascal/delphi_chainik2.htm):


"Нажимаем" клавиши в Блокноте (уже запущенном):

uses Sendkey; {описан ниже}

procedure TForm1.Button1Click(Sender: TObject);
var
 h: HWND;
begin
 h := FindWindow('Notepad', nil); // ищем окно Блокнота
 SendMessage(h, WM_SYSCOMMAND, SC_HOTKEY, h); // активизируем его
 PlayKeys(StrToKeys('abcdef')); // нажимаем клавиши
 SendMessage(Handle, WM_SYSCOMMAND, SC_HOTKEY, Handle); // возвращаем фокус
end;

Коды vk_ клавиш можно найти в Win32 Programmer's Reference (win32.hlp):
Virtual-Key Codes. {В дельфи не описаны коды клавиш ['A'..'Z'] и ['0'..'9'],
их получают с помощью Ord, например, Ord('A'), Ord('9')}.

Символы из верхнего ряда клавиатуры посылаются с нажатым Shift. Заметим, что
символы в локальной кодировке могут быть посланы после переключения
кодировки в активном приложении, например, если перключатель (switch)
Control-Shift, то это:

 PlayKeys(Chr(vk_control)+#0+Chr(vk_shift)+#0); {downkey = #0};

--- unit Sndkey.pas ---

unit sndkey;

interface

uses
 Windows,
 Messages;

const
 {VK constants missing from windows.pas}
 VK_SEMICOLON    = 186; {;}
 VK_EQUAL        = 187; {=}
 VK_COMMA        = 188; {,}
 VK_MINUS        = 189; {-}
 VK_PERIOD       = 190; {.}
 VK_SLASH        = 191; {/}
 VK_BACKQUOTE    = 192; {`}
 VK_LEFTBRACKET  = 219; {[}
 VK_BACKSLASH    = 220; {\}
 VK_RIGHTBRACKET = 221; {]}
 VK_QUOTE        = 222; {'}

 downkey = #0;
 upkey = Chr(KEYEVENTF_KEYUP); {#2}

procedure PlayKeys(const keys: String);
function StrToKeys(const s: String): String;

{Alt-F4:
PlayKeys(Chr(vk_menu)+#0+Chr(vk_f4)+#0+Chr(vk_f4)+#2+Chr(vk_menu)+#2)}
{"exit"<return>: PlayKeys(StrToKeys('exit'+chr(vk_return)));}
{"EXIT":
PlayKeys(Chr(vk_shift)+downkey+StrToKeys('exit')+Chr(vk_shift)+upkey));}
{or short form: PlayKeys(Chr(vk_shift)+#0+StrToKeys('exit'));}

implementation

function StrToKeys; {keystroke for alone keys}
var
 i: Longint;
 c: Char;
begin
 for i := 1 to Length(s) do
   begin
     c := s[i];
     if c in ['a'..'z'] then {Upper}
       c := Chr(Ord© and not $20);
     Result := Result + c + downkey
                      + c + upkey;
   end;
end;

procedure PlayKeys;
const
 ExtendedKeys : set of byte =
   [ vk_up,     vk_down,
     vk_left,   vk_right,
     vk_home,   vk_end,
     vk_prior,  vk_next,
     vk_insert, vk_delete];
var
 i, ips : Longint;
 fb, sb: Byte;
 keysdown: String;

 procedure keybd (vk, kp : Byte);
 begin
   if vk in ExtendedKeys then
     kp := kp + KEYEVENTF_EXTENDEDKEY;
   keybd_event(vk, MapVirtualKey(vk, 0), kp, 0);
 end;

begin
 keysdown := '';
 for i := 1 to Length(keys) div 2 do
   begin
     fb:= Ord(keys[2*i -1]);
     sb:= Ord(keys[2*i]);
     if sb = Ord(downkey) then
       keysdown := keysdown + Chr(fb)
     else
       begin
         ips := pos(Chr(fb), keysdown);
         if ips > 0 then
           Delete(keysdown, ips, 1)
         else
           Continue;
       end;
     keybd(fb, sb);
   end;
   {Autocomplete}
   for i := 1 to Length(keysdown) do
     keybd(Ord(keysdown[i]), Ord(upkey));
end;

end.
--- EOF unit Sndkey.pas ---

Leonid Troyanovsky <[email protected]>
  Вверх
Song
Дата 30.10.2002, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Цитата(Guest @ 30.10.2002, 09:20)
Если бы проблема была в дескрипторе, то у меня и VK_RETURN не посылался бы(наверное:)), а делаю я примерно так:
TheHandle:=FindWindow(nil,'Безымянный - Блокнот');
А потом работаю с етим Handl'ом через SendMessage.

:)
Вот именно, как я и говорил, не тот дискриптор Вы посылаете сообщение.
Сообщение надо посылать не на дискриптор блокнота-приложения, а на дискриптор окна Edit, в котором Вы как раз и набираете текст. Если всё это непонятно, загрузите WinSight и посмотрите иерархию объектов внутри блокнота и всё будет понятно.
В случае с блокнотом сообщение надо посылать не на TheHandle а на GetWindow(TheHandle,GW_CHILD)


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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