Мышь drag-drop в аналоге RAdmin
потихоньку идет разработка аналога РАдмин, в рамках одного проекта в среде D2010 ИНДИ10
на текущий день есть код переноса отжатия кнопок мыши с клиента на сервер в компоненте ИМЕДЖ1, в котором отображается скрин экрана сервера, все работает
КЛИЕНТ
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then
begin
IdTCPClient1.Host:=HOST.Text;
IdTCPClient1.Port:=StrToInt(PortNumber.Text);
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn('mouse_left ');
IdTCPClient1.Disconnect;
end;
if Button=mbRight then
begin
IdTCPClient1.Host:=HOST.Text;
IdTCPClient1.Port:=StrToInt(PortNumber.Text);
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn('mouse_right ');
IdTCPClient1.Disconnect;
end;
end;
СЕРВЕР
var
z: string;
X,Y:integer;
K:TPoint;
if SameText(Copy(z, 1, 11), 'mouse_move ') then
begin
z := AContext.Connection.IOHandler.ReadLn;
if SameText(Copy(z, 1, 8), 'mouse_x ') then
X:=StrToInt(Copy(z,9,4));
z := AContext.Connection.IOHandler.ReadLn;
if SameText(Copy(z, 1, 8), 'mouse_y ') then
Y:=StrToInt(Copy(z,9,4));
SetCursorPos(X,Y);
end;
if SameText(Copy(z, 1, 11), 'mouse_left ') then
begin
GetCursorPos(K);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN,K.X,K.Y,0,0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP,K.X,K.Y,0,0);
end;
if SameText(Copy(z, 1, 12), 'mouse_right ') then
begin
GetCursorPos(K);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTDOWN,K.X,K.Y,0,0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTUP,K.X,K.Y,0,0);
end;
AContext.Connection.Disconnect;
end;
end;
ВОПРОСЫ:
1. можно ли реализовать функцию перетаскивания объектов, как приблизительно код может выглядеть?
2. можно ли реализовать прокрутку с использованием колесика мыши (мышь - два баттона и колесо, стандартная), в событиях компонента ИМЕДЖ1 нет обработки колеса
3. в принципе, нужно ли делать обработку событий типа клик, двойной клик и что там может быть еще связянное с мышью, чтобы приблизиться к функционалу MSRDP?
У Image есть события OnMouseDown OnMouseUp OnMouseMove <- драг'н'дроп почти готов OnMouseDown на сервере событие mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_КНОПКАDOWN,K.X,K.Y,0,0); OnMouseMove на сервере mouse_event(...MOUSEEVENTF_MOVE...); OnMouseUp на сервере mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_КНОПКАUP,K.X,K.Y,0,0);
OnMouseScroll OnKeyDown OnKeyUp для TImage примеров нагуглить много можно, но имхо на сервер нужно не символ нажатой кнопки передавать а сканкод и использовать его в keybd_event.
Чтиво для досуга: mouse_event keybd_event
Ну и в заключение:имхо нужно абстрагироваться на клиенте от событий типа клик, двойной клик и т.д. об этом ОС на сервере позаботится, а передавать только "низкоуровневые" сигналы т.е. даблклик для ОС это быстрый вызов подряд mouse_event(...LEFTDOWN...)mouse_event(...LEFTUP...)mouse_event(...LEFTDOWN...)mouse_event(...LEFTUP...) на сервере
У Image есть события OnMouseDown OnMouseUp OnMouseMove <- драг'н'дроп почти готов
так что надо писать драг-и-дроп из отдельных событий? в ручную?
там вообще в событиях компонента есть OnStartDrag и OnDragOver и OnDragDrop и еще OnEngDrag. неясно только как из применять
информации, исходного кода, примеров нет случайно?
НЕТБЛИН. Ты не понял, ещё раз: нам нет необходимости реализовывать драг'н'дроп, даблик или ещё чтото. Необходимо лишь получить события мыши и передать их на сервер, где они выполнятся последовательно. В примере драг'н'дроп:
Переместили мышь = в клиенте отработал OnMouseMove, который передаёт серверу mousemove координаты, сервер выполняет mouse_event(...MOVE...)<<==У тебя для этого в коде SetCursorPos
Отжали кнопку = в клиенте сработал OnMouseUp, который передаёт серверу mouseup кнопка, сервер выполняет mouse_event(...UP...)
то есть предлагается вообще не использовать события компонета а получать события мыши через ВЫНь АПИ и отправлять на сервер?
а для чего тогда события OnStartDrag и OnDragOver и OnDragDrop и еще OnEngDrag в компоненте ИМЕДЖ1? их что нельзя использовать?
В идеале - да, но можно использовать и события TImage
а для чего тогда события OnStartDrag и OnDragOver и OnDragDrop и еще OnEngDrag в компоненте ИМЕДЖ1? их что нельзя использовать?
OnDragOver - это когда ты чтото тянешь над TImage (допустим файл с екслорера) в нём можно изменить например курсор (т.е. если пользовательтащит файл с расширением txt ставим курсором crDrag а если .bin то crNoDrop). А OnDagDrop - собыие винды когда ты уже перетащил чтото и уронил его на имажу , в нём можно узнать что уронили и сделать с этим чтонибудь:) On(Start|End)Drag - хз.
On(Start|End)Drag используется, если тянешь сам TImage. Почитайте про IDropSource, IDropTarget, IDataObject.