Текущий архив: 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.45 MB
Время: 0.006 c