Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-7202
Sergey13
2002-04-26 10:17
2002.06.03
Союз России и Беларуси.


14-7199
-=CrazyFish=-
2002-04-22 11:19
2002.06.03
ZX Spectrum


14-7206
gek
2002-04-25 15:33
2002.06.03
Ребята сей передали что Хаттаба завалили


1-7068
Vygantas
2002-05-21 11:40
2002.06.03
Kompiliacija programy


1-7023
MegaVolt
2002-05-16 13:18
2002.06.03
Как сделать дерево выбора каталога с CheckBox`ами?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский