Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2010, 09:36   #1
Tihon
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 40
По умолчанию Трудности с управлением чужим приложением

Имеется чужое приложение - малое окно (карта) внутри большого (интерфейс).
На карте нажатой правой кнопкой мыши можно выделить прямоугольный блок, после чего он будет растянут на всю область внутреннего окна (масштабирование). Это штатная функция карты (программа написана на MFC).

На Делфи 6 пишу приложение, которое будет управлять картой - в частности, масштабировать.

Вот процедура.
Код:
procedure TForm1.Button13Click(Sender: TObject);
var
    Hnd, MapHnd : HWND;
    X, Y, Rx : Integer;
    lparam : Cardinal;
    Rw, Rt : TRect;
begin
    Hnd:=FindWindow(nil, 'Навигатор');
    GetWindowRect(Hnd, Rw);

    MapHnd := FindWindowEx(Hnd,0,'AfxFrameOrView70','');
    SetForegroundWindow(MapHnd);

    SetCursorPos(20, 220);
    GetWindowRect(MapHnd, Rt);

    X := 8;
    Y := 82;
    lparam := Y + X shl 16;
    PostMessage(MapHnd,WM_MOUSEMOVE,2,lparam);
    Rx := 0;
    Repeat
       begin
         X := X + 1;
         Y := Y + 1;
         lparam := Y + X shl 16;
         PostMessage(MapHnd,WM_MOUSEMOVE,2,lparam);
         Inc(Rx);
       end;
    Until Rx = 100;
    PostMessage(MapHnd,WM_MOUSEMOVE,0,lparam);
end;
1. Получаю хендл и границы окна интерфейса.
2. Получаю хендл окна с картой (имя класса окна - AfxFrameOrView70) и кидаю на него фокус.
3. Помещаю на карту курсор мыши.
4. Симулирую нажатие правой кнопки и обведение области масштабирования.

Сначала с помощью SPY++ контролирую сообщения при ручном выделении блока на карте.
Потом из своего приложения по кнопке выполняю процедуру, приведенную выше. Просматриваю лог SPY++.

Разницы между двумя логами процессов не наблюдаю. Но - выделение блока не работает.
Визуально на карте все кончается установкой мыши в положение от SetCursorPos.
Дальше процедура крутит цикл, в логе SPY++ идут сообщения о WM_MOUSEMOVE с изменением lparam, мышиный курсор остается на месте.

Пожалуйста, посмотрите текст, помогите советом.
Спасибо.
Tihon вне форума Ответить с цитированием
Старый 15.04.2010, 10:09   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...не видно в коде собственно нажатия правой кнопки мыши/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.04.2010, 10:55   #3
Tihon
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 40
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...не видно в коде собственно нажатия правой кнопки мыши/
Код:
PostMessage(MapHnd,WM_MOUSEMOVE,2,lparam);
Возможно, я ошибаюсь, - разве "2" - не то же для MOUSEMOVE, что MK_RBUTTON?!

Ибо-
Код:
MK_RBUTTON		=  2;
(Это отсюда :http://erpandcrm.ru/vipprogr.ru/ls17_5_9_3_3.html)...
Кроме того, при ручном выделении мышью (по логу SPY++) именно так записывается информация о движении мыши с выделением блока.

************************
Получилось, с использованием MOUSE_EVENT.
Код:
  Pt.x := 20;
  Pt.y := 200;
  Pt.x := Round(Pt.x * (65535 / Screen.Width));
  Pt.y := Round(Pt.y * (65535 / Screen.Height));
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTDOWN, Pt.x, Pt.y, 0, 0);
  Pt.x := 100;
  Pt.y := 300;
  Pt.x := Round(Pt.x * (65535 / Screen.Width));
  Pt.y := Round(Pt.y * (65535 / Screen.Height));
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, Pt.x, Pt.y, 0, 0);
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTUP, Pt.x, Pt.y, 0, 0);
И все же, мне очень интересно, - как выполнить то же самое с WinApi, как было задумано?
Потому тему пока не закрываю.

Последний раз редактировалось Tihon; 15.04.2010 в 12:28.
Tihon вне форума Ответить с цитированием
Старый 19.04.2010, 17:57   #4
UginL7
Пользователь
 
Регистрация: 19.04.2010
Сообщений: 14
По умолчанию

а чем тебе MOUSE_EVENT не WinApi?
Victōrem a victo superāri saepe vidēmus.
UginL7 вне форума Ответить с цитированием
Старый 19.04.2010, 19:51   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...TC, вообще-то - postmessage(MapHnd,WM_RBUTTONDOWN,0 , (x shl 16)+ y) ...а насчет ваших ремарок насчет winapi, вам >>> сюда <<<
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переходник между чужим приложением и его файлами Biohazard Работа с сетью в Delphi 4 13.02.2010 10:31
Flash-сайт под управлением MODx Antoha WordPress и другие CMS 3 27.12.2009 17:04
delphi с управлением света khasanov_ruslan Помощь студентам 2 24.04.2009 11:53
Простейшая работа с чужим приложением... ActiveX Помощь студентам 1 31.01.2008 08:17
Работа с чужим приложением ERASERROR Win Api 2 28.01.2008 15:22