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

Вниз

Работа с чужим окном   Найти похожие ветки 

 
Vadims ©   (2002-07-31 01:32) [0]

Здравствуйте!
По долгу службы я работаю с административным ПО, которое заносит библиотечные карточки в электронную картотеку. При этом приходится бродить по куче окон этого ПО. Я решил автоматизировать этот процесс, написав прогу, которая принимает данные в своей единственной форме и «разносит» их по окнам оригинальной программы. И все было бы ОК, если бы мне не надо было сэмулировать либо двойной клик на компоненте, либо нажатие F4 на нем же.
Я знаю практически все об окне и компоненте: хэндл окна (wnBip: HWND), хендл компонента (cmTy: HWND), координатный прямоугольник(R: TRect), который занимает этот компонент в окне. Но при отправке сообщения WM_LBUTTONDBCLK ничего не происходит, хотя при работе с самой программой должно появляться еще одно окно. Как я понимаю, моя программа должна выполнить.
1. Привязать мышь к окну wnBip - SetCapture(wnBip);
2. Отправить сообщение WM_LBUTTONDBCLK компоненту cmTyp с координатами внутри компонента;
3. Восстановить мышь - ReleaseCapture.
Как правильно оформить пункт 2: кому посылать это сообщение - окну или компоненту? Как указать координаты - абсолютно или относительно (и относительно чего - окна или компонента?).
И вообще, правильно ли я мыслю, насчет посылки двойного клика чужому компоненту в чужое окно?
Что касается с отправкой сообщения нажатия F4, то тут такая заковыка.
С нажатием Down проблем нет - пишу SendMessage(cmTyp, WM_KEYDOWN, VK_DOWN, 0) (cmTyp - хэндл компонента) где и действие выполняется. А вот SendMessage(cmTyp, WM_KEYDOWN, VK_F4, 0) не работает из-за, насколько я понял, последнего параметра. Но каким он должен быть для F4 я не понимаю, сколько бы хэлп не читал и сколько бы не экмперементировал. Объясните мне это.
Тип этого контрола WinSight определяет как Centura:ChildTable. В Делфи аналогом ему скорее всего является TstringGrid с фиксированным левым столбцом.
Буду признателен за советы. Если можно, пишите их на vadims@mksat.net


 
Song ©   (2002-07-31 09:47) [1]

В Вашем случае легче будет воспользоваться keybd_event/mouse_event.
Любые WM_* сообщения не зависят ни от координат, ни от положении или состоянии мыши, они посылаются на дескриптор, который нужно сначала правильно найти, тогда всё работать будет.
Компонент - это понятие только на момент разработки программы. В готовых приложениях есть только окна. кнопка - окно, чекбокс - тоже окно и т.д. поэтому нажатие нужно посылать окну-кнопке (это чтобы понятно было), а не тому окну, которое Вы подразумеваете под формой.


 
Eugen Honeker   (2002-07-31 14:39) [2]

Программа имеет наверника меню или ?
если да, то можно просто с какимнибудь
"resource editor" посмотреть какие
id"s в меню.
а потом просто послать комманду
sendmessage(hwnd, WM_COMMAND, menu-id, 0)
на главное(hwnd) окно.


я таким образом написал remote-control для
windows mediaplayer.

извиняюсь за плохой русский :)


 
Vadims ©   (2002-07-31 20:10) [3]

Спасибо, Song!
Ваш совет помог. Если кто интересуется, привожу фрагмент кода, правда, может, он не оптимизирован в смысле схемы переключения между своим-чужим окном, зато работает.
Hide;
h := GetForegroundWindow();
SetForegroundWindow(wnBip);
ShowWindow(wnBip, SW_SHOWNORMAL);
keybd_event(VK_F4, 0, 0, 0);
SetForegroundWindow(h);
ShowWindow(h, SW_SHOWNORMAL);
Show;



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

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

Наверх




Память: 0.48 MB
Время: 0.018 c
1-61200
VDen
2002-09-08 16:15
2002.09.19
Печать QReport-отчета


3-60996
Nash
2002-08-29 15:34
2002.09.19
Подскажите пожалуйста синтаксис between, а то запутался с кавычка


1-61163
Poirot
2002-09-07 11:56
2002.09.19
Как вшивают любой файл в BMP например!!!


3-60945
Mars
2002-08-28 11:22
2002.09.19
Как отследить изменение текущей записи в БД?


3-60949
ev1972
2002-08-28 09:54
2002.09.19
Advantage Dataset: Как открыть DBF не подключая CDX?