Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.03;
Скачать: CL | DM;

Вниз

Как отправить клавиатурную комбинацию другому процессу... перерыл форум но так и не нашел ответа...   Найти похожие ветки 

 
John Forest ©   (2002-03-26 09:34) [0]

Вот собственно и весь вопрос... Задача слать любые клавиатурные комбинации в другое окно такие как Ctrl+A, Ctrl+Alt+A... и т.д.
Я уже много форумов и факов перерыл и так и не нашел... хм.. странно :o)


 
Dimka Maslov ©   (2002-03-26 10:06) [1]

keybd_event


 
John Forest ©   (2002-03-26 10:20) [2]

Хм... видимо не внимательно прочли... ДРУГОМУ надо слать окну!!!


 
AFROLOV   (2002-03-26 10:20) [3]

SendMessage


 
John Forest ©   (2002-03-26 10:30) [4]

Хех и что sendmessage??
я пробовал так:
PostMessage(ProcHWND, WM_SYSKEYDOWN, VK_CONTROL, 0);
PostMessage(ProcHWND, WM_KEYDOWN, VK_F5, 0);
PostMessage(ProcHWND, WM_KEYUP, VK_F5, 0);
PostMessage(ProcHWND, WM_KEYUP, VK_CONTROL, 0);
Сработало тока для того приложения у которого хот кей на это есть... скажем в Far"е не работает...
Кто ни будь может привести РАБОЧИЙ пример как слать сообщения из своего процесса другому неактивному?


 
SerVS - S   (2002-03-26 10:53) [5]

>John Forest
Если ты правильно указываешь ProcHWND, то процесс его получит, но обработает только после активации, наверное ;)
Может у кого есть мысли как почлать такое сообщение всем (что типа broadcost)


 
John Forest ©   (2002-03-26 11:01) [6]

>SerVS - S

Правильно то правильно... хм... опишу ситуацию подробнее:
Короче частный пример есть игра UO вот туда мне и надо слать кнопки... причем кнопки БЕЗ модификаторов летят на ура... С модификаторами (как я привел пример) модификаторы почему-то вырезаются совсем...
Причем пробовал следить за окном... и посмотреть что же шлется окну-то... в ситуации с Батом я как раз и увидел то что приводил в примере... а вот с окном UO хех НИЧЕГО не было... вот это меня и покоробило... :o/

Что ты имел ввиду под фразой "после активации"?
Есть ли у проги обработчик этогй комбинации?
И причем тут броад каст... с ним то вроде как раз и нет проблем... :o)

Неужель никто не слал такие комбинации??


 
John Forest ©   (2002-03-26 11:14) [7]

... Еще забавно:
Вот эта комбинация не сработала в Бате (это показ письма с заголовком)
PostMessage(ProcHWND, WM_SYSKEYDOWN, VK_SHIFT, 0);
PostMessage(ProcHWND, WM_SYSKEYDOWN, VK_CONTROL, 0);
PostMessage(ProcHWND, WM_KEYDOWN, Ord("K"), 0);
PostMessage(ProcHWND, WM_KEYUP, Ord("K"), 0);
PostMessage(ProcHWND, WM_KEYUP, VK_CONTROL, 0);
PostMessage(ProcHWND, WM_KEYUP, VK_SHIFT, 0);

Почему? :o)


 
John Forest ©   (2002-03-26 15:45) [8]

Хм... неужели нет однозначного ответа как это сделать?


 
John1   (2002-03-29 10:14) [9]

...... в общем разобрался я с отправкой комбинаций типа Alt+клавиша...
TKeyData = Record
RepeatCount : Word;
ScanCode : Byte;
Flags : Byte;
end;

procedure TfrmMain.spbStart1Click(Sender: TObject);
var
lCtrlKey :TKeyData;
lShiftKey :TKeyData;
lAltKey :TKeyData;
lKey :TKeyData;
begin
lAltKey.RepeatCount := 1;
lAltKey.ScanCode := MapVirtualKey(VK_MENU, 0);
lAltKey.Flags := $20;

lKey.RepeatCount := 1;
lKey.ScanCode := MapVirtualKey(VK_F5, 0);
lKey.Flags := $00;

PostMessage(ProcHWND, WM_KEYDOWN, VK_CONTROL, LongWord(lCtrlKey));
PostMessage(ProcHWND, WM_KEYDOWN, VK_F5, LongWord(lKey));
end;

теперь осталось вчислить комбинации Ctrl+клавиша и Shift+клавиша... далее ударным прорывом на комбинации... кому интересно давайте поучаствуйте... т.к. чтение Win32Help ниччего не прояснило... поиски по всяким форумам и даже сайтам (на гугле сделал запросто sendkey) ничего не дали... на MSDN тоже голяк...


 
BugMaker ©   (2002-03-29 10:26) [10]

Посмотри SendKey32.pas (имеется в дистрибутиве, папка EXTRAS) приведу кусок заголовка файла:

This unit includes two routines that simulate popular Visual Basic routines: Sendkeys and AppActivate. SendKeys takes a PChar
as its first parameter and a boolean as its second, like so:

SendKeys("KeyString", Wait);

where KeyString is a string of key names and modifiers that you want to send to the current input focus and Wait is a boolean variable or value that indicates whether SendKeys should wait for each key message to be processed before proceeding. See the table below for more information. AppActivate also takes a PChar as its only parameter, like so:

AppActivate("WindowName");

where WindowName is the name of the window that you want to make the current input focus.

SendKeys supports the Visual Basic SendKeys syntax, as documented below.

Supported modifiers:

+ = Shift
^ = Control
% = Alt



 
John1   (2002-03-29 10:42) [11]

>BugMaker
Видимо читать топик это рскошь... данная либа как и море жругих реализуют это ТОЛЬКО С АКТИВНЫМ окном... я же описал задачу ДЛЯ НЕАКТИВНОГО окна... так что... хм читать топик с начала :o)


 
BugMaker ©   (2002-03-29 10:50) [12]

А что мешает их переключать?! Сделал окно активным, послал что нужно, и переключи обратно :-) Ну не мышкой же ты его активизировать будешь %)))


 
John1   (2002-03-29 10:53) [13]

>BugMaker
Задача состоит чтоб посылать сообщения не теряя текущего фокуса... так что ваше предложение не прокатит... кстати эта тема поднималась здесь не раз... (я перерыл весь форум) и глохла... так что я это дело так не оставлю...

P.S. мой пример выше работает именно так как надо НО только с посылкой просто клавиши и Alt+клавиша...


 
BugMaker ©   (2002-03-29 11:08) [14]

А ты не пробовал в TKeyData в твоем коде изменять биты у Flags? По- моему, это именно то, что нужно :-). То есть какой- то бит там выставляет Ctrl, какой- то Shift, и бит с номером 5- это Alt %)))


 
John1   (2002-03-29 11:14) [15]

Хех видимо у Вас не получилось заглянуть в доку... Бит 24 от начала структуры указывает что клавиша расширенная.... биты 29, 30, 31 используются слегка по разному в WM_CHAR, WM_KEYDOWN... так что вопрос открыт... причем состоение этих битов в описании и в реале слегка расхожи...


 
John1   (2002-03-30 11:04) [16]

Хм... как оказалось при WM_KEYDOWN не передается статус клавишь Ctrl и Shift... еще более странно что именно с этим типом WinSight показывал что они передаются... есть ли ОПРЕДЕЛЕННОЕ мнение как передавать комбинации типа Ctrl+клавиша и Shift+клавиша?


 
Song ©   (2002-03-30 13:15) [17]

Скорей всего смысл заключается в следующем: если нам нужно послать шифт+F5, то сначала посылаем шифт и F5 последовательно через WM_KEYDOWN, потом обрабатываем это сообщение, потом отжимаем в таком же порядке WM_KEYUP и опять обрабатываем.


 
Song ©   (2002-03-30 13:23) [18]

Вот смотри, вроде оно:

------------------------------------------------------------
Q-94: Как нажать клавиши в другом приложении?
------------------------------------------------------------
"Нажимаем" клавиши в Блокноте (уже запущенном):

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(c) 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 ---


 
John1   (2002-03-31 12:15) [19]

Не катит.... окно мне не надо активизировать... надо слать в НЕАКТИВНОЕ и НЕ В ФОКУСЕ!


 
Song ©   (2002-03-31 14:01) [20]

Значит как я сказал в Song © (30.03.02 13:15)



Страницы: 1 вся ветка

Текущий архив: 2002.06.03;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.009 c
3-6880
cranium
2002-05-06 03:38
2002.06.03
Оптимальная структура базы?


3-6930
khan
2002-05-14 06:34
2002.06.03
Колесо мыши в DBGRID


14-7165
PVOzerski
2002-04-24 14:07
2002.06.03
реален ли обмен SIMM ?


14-7205
lipskiy
2002-04-25 23:15
2002.06.03
Вопрос только Питерцам!


1-6961
Hurin
2002-05-22 17:46
2002.06.03
Графика