Всем спасибо, разобрался сам. Всего-то не сделал банальной вещи — открытия/закрытия буфера обменя.
Меняем функцию на вот такую:
[DllImport("user32.dll")]
public static extern int GetClipboardFormatName(uint format, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder formatName, int cchMaxCount);
[DllImport("user32.dll")]
public static extern bool OpenClipboard(IntPtr hwnd);
[DllImport("user32.dll")]
public static extern bool CloseClipboard();
[DllImport("user32.dll")]
public static extern bool EmptyClipboard();
public static void setEmptyFileToClipboard(Form form) {
OpenClipboard(form.Handle);
EmptyClipboard();
SetClipboardData(CF_HDROP, IntPtr.Zero);
CloseClipboard();
}
И дальше благополучно ловим сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS