Форум: "WinAPI";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];
ВнизКак отправить клавиатурную комбинацию другому процессу... перерыл форум но так и не нашел ответа... Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.006 c