Добрый день.
Мне потребовалось создать приложение, которое можети принимать данные путем перетаскивания их на форму из других приложений.
Причем, если перетащили HTML (например их ворда), то программа должа понять, что перетаскивают HTML и провести над ним
определенные оперции. Для этого я наследовал IDropTarget и реализовал необходимые функции.
type
TMainForm = class(TForm, IDropTarget)
...
private
function DragEnter(const dataObj: IDataObject;
grfKeyState: Longint;
pt: TPoint;
var dwEffect: Longint): HResult; stdcall;
function DragOver(grfKeyState: Longint;
pt: TPoint;
var dwEffect: Longint): HResult; stdcall;
function DragLeave: HResult; stdcall;
function Drop(const dataObj: IDataObject;
grfKeyState: Longint; pt: TPoint;
var dwEffect: Longint): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
...
В функции Drop я пишу следующее:
function TMainForm.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult;
begin
Result := S_OK;
if dataObj = nil then Exit;
ProcessHTMLFormat(dataObj);
end;
Функция ProcessHTMLFormat:
function TMainForm.ProcessHTMLFormat(const dataObj: IDataObject) : boolean;
var aFmtEtc : TFORMATETC;
aStgMed : TSTGMEDIUM;
pData : PChar;
i, len : Integer;
begin
Result := False;
with aFmtEtc do
begin
cfFormat := 49356;
ptd := nil;
dwAspect := DVASPECT_CONTENT;
lindex := -1;
tymed := TYMED_HGLOBAL;
end;
if Succeeded(dataObj.GetData(aFmtEtc, aStgMed)) then
begin
try
pData := GlobalLock(aStgMed.hGlobal);
len := GlobalSize(aStgMed.hGlobal);
i := Pos('<',pData);
if i > 0 then
begin
i := i - 1;
CopyMemory(pData,pData + i, len - i);
len := len - i;
end;
SaveDataToFile(GetTextFromData(dataObj),'html',pData,len);
Result := True;
finally
GlobalUnlock(aStgMed.hGlobal);
ReleaseStgMedium(aStgMed);
end;
end;
end;
Обратитие внимание, что cfFormat в структуре aFmtEtc я выставил в 49356, так как не было определения этого формата нигде. Я его определил экспериментальным путем.
Все работало нормально, но беда в том, что значение это не постоянно и может меняться. Как бы узнать, какой номер у HTML формата клипбоарда ?
Заранее спасибо.