Обработка перетаскивания ссылок в окно приложения
Обработка перетаскивания ссылок в окно приложения
С перетаскиванием файлов в окно приложения мы уже давно разобрались, это реализуется несложно. Теперь давайте разберем более интересную задачу, а именно перетаскивание в окно приложения ссылок или текста из браузеров, текстовых редакторов и других программ.
Делается это средствами интерфейсов OLE (Object Linking and Embedding). Но сперва нам понадобится несколько структур, которых, как вы уже догадались, в FASM изначально нет.
Code (Assembler) : Убрать нумерацию
- ; Интерфейс IDropTarget
- struct IDropTargetStruct
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- DragEnter dd ?
- DragOver dd ?
- DragLeave dd ?
- Drop dd ?
- refcount dd ?
- ends
- ; Интерфейс IDropTarget
- struct IDataObjectStruct
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- GetData dd ?
- GetDataHere dd ?
- QueryGetData dd ?
- GetCanonicalFormatEtc dd ?
- SetData dd ?
- EnumFormatEtc dd ?
- DAdvise dd ?
- DUnadvise dd ?
- EnumDAdvise dd ?
- refcount dd ?
- ends
- ; Структуры, используемые для получения переданных строк
- struct STGMEDIUM
- tymed dd ?
- hGlobal dd ?
- pUnkForRelease dd ?
- ends
- struct FORMATETC
- cfFormat dd ?
- lptd dd ?
- dwAspect dd ?
- lindex dd ?
- tymed dd ?
- ends
Code (Assembler) : Убрать нумерацию
- wminitdialog:
- ; Инициализация OLE
- invoke OleInitialize,NULL
- ; Настроить структуру IDropTarget для окна
- mov [IDropTarget.QueryInterface],IDropTarget_QueryInterface
- mov [IDropTarget.AddRef],IDropTarget_AddRef
- mov [IDropTarget.Release],IDropTarget_Release
- mov [IDropTarget.DragEnter],IDropTarget_DragEnter
- mov [IDropTarget.DragOver],IDropTarget_DragOver
- mov [IDropTarget.DragLeave],IDropTarget_DragLeave
- mov [IDropTarget.Drop],IDropTarget_Drop
- ; Разрешить окну принимать объекты
- mov [pDropTarget],IDropTarget
- invoke RegisterDragDrop,[hwnddlg],pDropTarget
Code (Assembler) : Убрать нумерацию
- wmclose:
- ; Освободить захват перетаскивания
- invoke RevokeDragDrop,[hwnddlg]
- invoke OleUninitialize
Code (Assembler) : Убрать нумерацию
- ; Строка названия формата, который будет обрабатывать окно приложения
- CFSTR_INETURL du 'UniformResourceLocatorW',0
Code (Assembler) : Убрать нумерацию
- proc IDropTarget_QueryInterface pthis:DWORD, iid:DWORD, ppvObject:DWORD
- ; S_OK
- xor eax,eax
- ret
- endp
- proc IDropTarget_AddRef pthis:DWORD
- lea eax,[pthis]
- inc [eax+IDropTargetStruct.refcount]
- mov eax,[eax+IDropTargetStruct.refcount]
- ret
- endp
- proc IDropTarget_Release pthis:DWORD
- lea eax,[pthis]
- dec [eax+IDropTargetStruct.refcount]
- mov eax,[eax+IDropTargetStruct.refcount]
- ret
- endp
- ;---------------------------------------------------------
- ; Метод DragEnter - курсор заходит на форму
- ;---------------------------------------------------------
- proc IDropTarget_DragEnter pthis:DWORD,lpDataObject:DWORD,grfKeyState:DWORD,\
- pt.x:DWORD,pt.y:DWORD,lpdwEffect:DWORD
- locals
- medium STGMEDIUM
- fmte FORMATETC
- endl
- push ebx esi
- ; DROPEFFECT_MOVE
- lea eax,[lpdwEffect]
- mov dword [eax],2
- ; Проверить перетаскиваемую информацию на соответствие
- ; формату ссылки
- lea eax,[medium]
- push eax
- lea ebx,[fmte]
- invoke RegisterClipboardFormat,CFSTR_INETURL
- mov [ebx+FORMATETC.cfFormat],eax
- mov [ebx+FORMATETC.lptd],NULL
- mov [ebx+FORMATETC.dwAspect],1
- mov [ebx+FORMATETC.lindex],-1
- mov [ebx+FORMATETC.tymed],1
- push ebx
- mov esi,[lpDataObject]
- mov eax,[esi]
- stdcall [eax+IDataObjectStruct.GetData],esi
- or eax,eax
- jz @f
- ; Перетаскиваемые данные не соответствуют формату
- ; E_INVALIDARG
- mov eax,80070057h
- @@:
- pop esi ebx
- ret
- endp
- ;---------------------------------------------------------
- ; Метод DragOver - курсор перемещается над формой
- ;---------------------------------------------------------
- proc IDropTarget_DragOver pthis:DWORD,grfKeyState:DWORD,\
- pt.x:DWORD,pt.y:DWORD,lpdwEffect:DWORD
- ; DROPEFFECT_MOVE
- lea eax,[lpdwEffect]
- mov dword [eax],2
- ; S_OK
- xor eax,eax
- ret
- endp
- ;---------------------------------------------------------
- ; Метод DragLeave - курсор покинул форму
- ;---------------------------------------------------------
- proc IDropTarget_DragLeave pthis:DWORD
- ; S_OK
- xor eax,eax
- ret
- endp
- ;---------------------------------------------------------
- ; Метод Drop - данные сброшены на форму
- ;---------------------------------------------------------
- proc IDropTarget_Drop pthis:DWORD,lpDataObject:DWORD,grfKeyState:DWORD,\
- pt.x:DWORD,pt.y:DWORD,lpdwEffect:DWORD
- locals
- medium STGMEDIUM
- fmte FORMATETC
- endl
- pusha
- ; DROPEFFECT_MOVE
- lea eax,[lpdwEffect]
- mov dword [eax],2
- lea eax,[medium]
- push eax
- lea ebx,[fmte]
- invoke RegisterClipboardFormat,CFSTR_INETURL
- mov [ebx+FORMATETC.cfFormat],eax
- mov [ebx+FORMATETC.lptd],NULL
- mov [ebx+FORMATETC.dwAspect],1
- mov [ebx+FORMATETC.lindex],-1
- mov [ebx+FORMATETC.tymed],1
- push ebx
- mov esi,[lpDataObject]
- mov eax,[esi]
- stdcall [eax+IDataObjectStruct.GetData],esi
- lea eax,[medium]
- mov eax,[eax+STGMEDIUM.hGlobal]
- mov eax,[eax]
- ; EAX - указатель на переданную строку
- ;---------------------------------------------
- ; действия с переданной строкой
- ;---------------------------------------------
- popa
- ; S_OK
- xor eax,eax
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------------
- ; Метод DragEnter - курсор заходит на форму
- ;---------------------------------------------------------
- proc IDropTarget_DragEnter pthis:DWORD,lpDataObject:DWORD,grfKeyState:DWORD,\
- pt.x:DWORD,pt.y:DWORD,lpdwEffect:DWORD
- ; DROPEFFECT_MOVE
- lea eax,[lpdwEffect]
- mov dword [eax],2
- ; S_OK
- xor eax,eax
- ret
- endp
- ;---------------------------------------------------------
- ; Метод Drop - данные сброшены на форму
- ;---------------------------------------------------------
- proc IDropTarget_Drop pthis:DWORD,lpDataObject:DWORD,grfKeyState:DWORD,\
- pt.x:DWORD,pt.y:DWORD,lpdwEffect:DWORD
- locals
- medium STGMEDIUM
- fmte FORMATETC
- endl
- pusha
- ; DROPEFFECT_MOVE
- lea eax,[lpdwEffect]
- mov dword [eax],2
- lea eax,[medium]
- push eax
- lea eax,[fmte]
- mov [eax+FORMATETC.cfFormat],0Dh
- mov [eax+FORMATETC.lptd],NULL
- mov [eax+FORMATETC.dwAspect],1
- mov [eax+FORMATETC.lindex],-1
- mov [eax+FORMATETC.tymed],1
- push eax
- mov esi,[lpDataObject]
- mov eax,[esi]
- stdcall [eax+IDataObjectStruct.GetData],esi
- lea eax,[medium]
- mov eax,[eax+STGMEDIUM.hGlobal]
- mov eax,[eax]
- ; EAX - указатель на переданную строку
- ;---------------------------------------------
- ; действия с переданной строкой
- ;---------------------------------------------
- popa
- ; S_OK
- xor eax,eax
- ret
- endp
В приложении примеры программ с исходными текстами, одна из которых позволяет перетаскивать в свое окно только ссылки, а вторая принимает любые строковые данные из приложений.
Просмотров: 1865 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария