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

Вниз

Передача сообщений в чужое окно   Найти похожие ветки 

 
esVer ©   (2003-10-30 10:05) [0]

Есть необходимость запустить другую программу и послать туда сообщение. Всё вроде бы нормально, но эта (чужая) программа стартует достаточно долго и сообщение может быть элементарно ею пропущено. Проверка наличия окна программы ничего не дает, т.к. окно может уже присутствовать на экране, но программа элементарно не может выполнить мою команду, т.к. выполняет при старте кучу своих действий. Есть ли возможность определить у чужого окна готовность принимать мои сообщения?

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

Уточнение: имитируется нажатие клавиш при помощи keybd_event.


 
Woolen   (2003-10-30 10:56) [1]

Ни хрена не понял. А в чем проблема задержки? Ну пускай обработает позже. Почему так нельзя?


 
esVer ©   (2003-10-30 10:58) [2]

В том-то и проблема, что не отрабатывает... :(


 
Woolen   (2003-10-30 11:00) [3]

А ты уверен, что она вообще его отрабатывает? В запущенном состоянии пробовал посылать?


 
esVer ©   (2003-10-30 11:11) [4]

Уверен. Она даже иногда успевает отработать и при старте :)
Но хочется не иногда, а всегда :)


 
DVM ©   (2003-10-30 11:12) [5]

Если есть окно и ему послано сообщение, то оно до окна дойдет всегда. Может и не сразу но дойдет.


 
esVer ©   (2003-10-30 11:20) [6]

Нужно чтобы не просто дошло, а было отработано. Насколько мне позволяют судить мои скромные знания и опыт, Windows может вполне благополучно "похерить" их.


 
DVM ©   (2003-10-30 11:26) [7]


> Windows может вполне благополучно "похерить" их.

Если только система находится в критическом состоянии (нет памяти, загружена и т.д.), да и то вряд ли. Это очень отлаженный механизм, он ведь основа всего оконного интерфейса.


 
esVer ©   (2003-10-30 11:35) [8]

Рад вашим успехам в освоении оконного интерфейса. У меня, к сожалению, не всё так безоблачно.


 
DVM ©   (2003-10-30 11:51) [9]


> У меня, к сожалению, не всё так безоблачно.

что за сообщение шлете окну?


 
esVer ©   (2003-10-30 11:57) [10]

Еще раз: имитируется нажатие клавиш при помощи keybd_event.

На тестовых примерах все проходит нормально. Но реальная программа при старте сильно загружена и результат не всегда положительный.


 
DVM ©   (2003-10-30 12:00) [11]

А если послать через SendMessageTimeout и если сообщение не дошло, то "долбать" окно сообщением пока не среагирует.


 
esVer ©   (2003-10-30 12:11) [12]

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


 
Игорь Шевченко ©   (2003-10-30 12:40) [13]


> Насколько мне позволяют судить мои скромные знания и опыт,
> Windows может вполне благополучно "похерить" их.


Не может. Набирайся больше знаний и опыта.


 
esVer ©   (2003-10-30 12:45) [14]


> Набирайся больше знаний и опыта

Стараюсь, но не всегда получается.
Если сообщение ставится в очередь, но не отрабатывается окном, то какова причина?


 
Игорь Шевченко ©   (2003-10-30 12:53) [15]

esVer © (30.10.03 12:45)

Любая, зависит от программы. (Ну не хочет она твое сообщение обрабатывать, например)


 
Юрий Зотов ©   (2003-10-30 13:06) [16]

> esVer

Посмотрите WaitForInputIdle.


 
esVer ©   (2003-10-30 13:31) [17]


> Посмотрите WaitForInputIdle.


Спасибо, попробую.


 
Nikolay M. ©   (2003-10-30 13:42) [18]


> Ранее я делал через SendMessage

А ты делай через PostMessage - там как раз сообщение встает в очередь последним.


 
esVer ©   (2003-10-30 13:51) [19]


> Nikolay M.

keybd_event в моих экспериментах давал наиболее приемлимый результат.


 
Ketmar ©   (2003-10-30 15:41) [20]

между прочим, откуда уверенность, что keybd_event попадает именно туда и тогда? кстати, сказать, в МОИХ программах это был как раз самый ненадёжный способ. а вот SendMessage не подводил ни разу. только посылать его надо в правильное место %-) ну и посмотреть внимательно, какие последовательности WM_xxx генерирует нажатие клавишей.


 
Игорь Шевченко ©   (2003-10-30 15:46) [21]

Ketmar © (30.10.03 15:41)
esVer © (30.10.03 13:51)

keybd_event - это имитация нажатия физической клавиши. Куда оно посылается, зависит от того, какое окно в момент нажатия имеет фокус ввода.


 
Сатир ©   (2003-10-30 15:50) [22]

Давай исходник, поправим.


 
Ketmar ©   (2003-10-30 16:28) [23]

>Игорь Шевченко © (30.10.03 15:46) [21]
а я как раз об этом.


 
esVer ©   (2003-10-30 17:13) [24]


> между прочим, откуда уверенность, что keybd_event попадает
> именно туда и тогда?

100% уверенности конечно нет. Чужая программа запускается через CreateProcess. Далее делается пауза на несколько секунд, после чего посылается команда. Вместо паузы пробовал делать
while FindWindow(pWinClass, pWinCap)<>0
результат был еще хуже :(


...
procedure PressDigit(const H: HWND; const N: Integer);
begin
keybd_event(VK_NUMPAD0+N, MapVirtualKey(VK_NUMPAD0+N, 0), 0, 0);
keybd_event(VK_NUMPAD0+N, MapVirtualKey(VK_NUMPAD0+N, 0), KEYEVENTF_KEYUP, 0);
end;
{}
var
H, h_old: HWND;
i : integer;
begin
H := FindWindow(pClass, pCaption);
if H = 0 then exit;
h_old:=GetForegroundWindow;
SHOWWINDOW(H, SW_RESTORE);
SetForegroundWindow(h);
PressDigit(H, 1);


 
MBo ©   (2003-10-30 17:27) [25]

>Далее делается пауза на несколько секунд

значит, обещание в [17] не исполнил...


 
Nikolay M. ©   (2003-10-30 17:27) [26]


> VK_NUMPAD0+N

Пароль подбираем? :)


 
Сатир ©   (2003-10-30 18:37) [27]


> Пароль подбираем? :)

Какая разница?
Но ведь исходник не весь.
Где то место, откуда посылаются сообщения(PostMessage/SendMessage)?

The keybd_event function synthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver"s interrupt handler calls the keybd_event function.

VOID keybd_event(

BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);


 
Ketmar ©   (2003-10-30 18:53) [28]

>Сатир © (30.10.03 18:37) [27]
а оно глубоко в кишках винды находится. вот эта самая болезная keybd_event и генерирует PostMessage из себя. изрыгает, так сказать.


 
esVer ©   (2003-10-30 22:23) [29]


> Nikolay M. © (30.10.03 17:27) [26]
> > VK_NUMPAD0+N
> Пароль подбираем? :)

Извините, Николай, но почему нужно кругом одни гадости видеть?
Может быть будем думать о людях лучше?


 
esVer ©   (2003-10-30 22:31) [30]


> Сатир
> Но ведь исходник не весь.
> Где то место, откуда посылаются сообщения(PostMessage/SendMessage)?

Так я же пишу:

SHOWWINDOW(H, SW_RESTORE);
SetForegroundWindow(h);

Т.е. я пытаюсь сделать активным окно той программы, а потом уже делаю keybd_event

>
> The keybd_event function synthesizes a keystroke. The system
> can use such a synthesized keystroke to generate a WM_KEYUP
> or WM_KEYDOWN message. The keyboard driver"s interrupt handler
> calls the keybd_event function.

Если я правильно понял смысл, то можно и через WM_..., но обработчик прерываний от драйвера клавиатуры использует именно
keybd_event
:))


 
Nikolay M. ©   (2003-10-30 22:44) [31]


> esVer © (30.10.03 22:23) [29]
> > Пароль подбираем? :)
> почему нужно кругом одни гадости видеть?

Ну, почему же гадости :)
Просто спросил... Спросить нельзя?



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

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

Наверх




Память: 0.54 MB
Время: 0.042 c
7-79213
Shopot
2003-09-13 16:31
2003.11.24
Шрифты для матричного принтера


3-78790
Alibaba
2003-11-04 13:17
2003.11.24
Результат


1-78895
Марат
2003-11-13 06:02
2003.11.24
Запись в текстовый файл


14-79186
mip
2003-10-29 10:01
2003.11.24
Где купить лицензионный Delphi подешевле ?


4-79233
plyaznik
2003-09-28 12:05
2003.11.24
не работает RegEnumKey