ДД
Денис Димитриев

Управление интернет картой программным путём через TWebBrowser (Delphi7)

Вопрос не для новичков, пожалуйста не отвечайте, если не поняли сути.
Предположим на форме есть компонент TWebBrowser(WB1) и четыре TButton(B1..4).
Зададим:
WB1.Navigate('http://wikimapia.org/#lat=47.8237139&lon=35.0203577&z=15&l=1&m=b');
WB1 загрузит карту, которой можно управлять клавишами навигации (стрелки вверх, вниз, вправо и влево) или перетаскивать с помощью мыши.
Вопрос заключается в следующем: возможно ли организовать программную реализацию клавиш навигации на B1, B2, B3, B4 соответственно.
(т. е. чтобы при нажатии на B1, например карта сдвигалась вверх, и т. д. )
Если кто-то может помочь, просьба накидать проект в Делфи (это минута времени, если имеется Д7), т. к. всё не так очевидно как может показаться.
Что я пробовал:
WB1.Perform(WM_KEYDOWN, 38, 0); // и CN_KEYDOWN и разные варианты параметров.. .
WB1.Dispatch(); // с многими вариантами Message
SendMessage(WB1.HWND, WM_KEYDOWN, 38, 0); // алалогично, перепробовал много разных комбинаций
есть ещё вариант - менять координаты в URL-строке WB1, но после придётся делать WB1.Refresh; что приведёт к перезагрузке карты, и является не приемлемым.
Поэтому просьба проверить предложенный метод сначала в Д7, это займёт минимум времени.
Спасибо заранее всем, кто уделил время.

АУ
Алина Утрисова

Значится, так. Легкое гугление и анализ выдачи WinSight32 показали, что работает следующая конструкция.

1. Заводим функцию, которая будет определять хэндл эксплорера, лежащего в компоненте WebBrowser:

function TForm1.GetIEHandle(WebBrowser: TWebbrowser; ClassName: string): HWND;
var
hwndChild, hwndTmp: HWND;
oleCtrl: TOleControl;
szClass: array [0..255] of char;
i :Integer;
begin
oleCtrl :=WebBrowser;
hwndTmp := oleCtrl.Handle;
i := 0;
while (true) do
begin
hwndChild := GetWindow(hwndTmp, GW_CHILD);
GetClassName(hwndChild, szClass, SizeOf(szClass));
Memo1.Lines.Add(string(szClass) + ' - ' + IntToStr(hwndChild));
if (string(szClass)=ClassName) then
begin
Result :=hwndChild;
Exit;
end;
hwndTmp := hwndChild;
end;
Result := 0;
end;

2. Пишем обработчик клика кнопки (я юзал SpeedButton-ы - при их нажатии фокус не дергается) :

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
H : hwnd;
begin

// получаем хэндл эксплорера
H := GetIEHandle(WebBrowser1,'Internet Explorer_Server');

// переводим фокус на эксплорер
PostMessage(H, WM_MOUSEACTIVATE, Self.Handle, 1);
PostMessage(H, WM_LBUTTONDOWN, MK_LBUTTON, MakeLParam(202, 134));
PostMessage(H, WM_LBUTTONUP, 0, MakeLParam(202, 134));
PostMessage(H, WM_CAPTURECHANGED, 0, H);
PostMessage(H, WM_IME_SETCONTEXT, 1, 1);
PostMessage(H, WM_SETFOCUS, self.ActiveControl.Handle, 1);

// отправляем нажатие стрелки вверх
PostMessage(H, WM_KEYDOWN, VK_UP, 0);
PostMessage(H, WM_KEYUP, VK_UP, 0);
end;

3. вот как-то так.

Похожие вопросы
delphi7: объекты без гласных!
Почему ошибки в Delphi7?
Помогите установить Delphi7
Delphi7. Символьный массив
как нарисовать цветок в Delphi7 ?
C++ Builder программное отключение интернета (не вирь)
Вопрос по delphi7 и image
Задачка по информатике в Delphi7
Delphi7 работа с канвой.
Как исправить эту проблему?? (Delphi7)