Java 如何在JNI调用中使用windows.h setClipboardContent方法?
我正在实现一个JNI方法,该方法调用windows.h中的setClipboardContent函数来设置windows剪贴板内容。标题如下所示。formatName是剪贴板格式,数据是Java中的字节[]。它是您要放入剪贴板的数据 我对如何在JNI方法中调用setClipboardContent函数感到困惑。有人能帮忙吗Java 如何在JNI调用中使用windows.h setClipboardContent方法?,java,winapi,java-native-interface,Java,Winapi,Java Native Interface,我正在实现一个JNI方法,该方法调用windows.h中的setClipboardContent函数来设置windows剪贴板内容。标题如下所示。formatName是剪贴板格式,数据是Java中的字节[]。它是您要放入剪贴板的数据 我对如何在JNI方法中调用setClipboardContent函数感到困惑。有人能帮忙吗 JNIEXPORT jboolean JNICALL Java_msoffice_MSOfficeClipboard_setClipboardContents(JNIEnv
JNIEXPORT jboolean JNICALL Java_msoffice_MSOfficeClipboard_setClipboardContents(JNIEnv *pEnv, jobject, jstring formatName, jbyteArray data)
{
BOOL fSucces = OpenClipboard(NULL);
if (fSucces) {
EmptyClipboard();
const char *str = pEnv->GetStringUTFChars(formatName, NULL);
if (str = NULL) return false; /* OutOfMemoryError already thrown */
UINT format = RegisterClipboardFormat(str);
pEnv->ReleaseStringUTFChars(formatName, str);
// This is where I should call setClipboardContent(format, HANDLE) method. I don't know what to do here.
CloseClipboard();
}
return fSucces;
}假设剪贴板格式只是一个数据块,您需要分配一块具有GlobalAllocGMEM\u MOVEABLE的内存,并从数据数组中复制数据。某些剪贴板格式需要特殊行为CF_位图需要HBITMAP等。您计划从何处获取句柄?为了调用setClipboardContents函数,我需要提供数据句柄。现在,我对如何创建句柄而不是指针感到困惑。我是winapi.HANDLE winapi SetClipboardData的新手,在UINT uFormat中,在opt HANDLE hMem中;GlobalAlloc为您提供了传递给SetClipboardData的句柄;正如我所说,这只适用于内存块格式。嗨@Luke,请您看看上面新粘贴的代码好吗?memcpy语句引发错误。应根据需要取消注释GlobalLock和GlobalUnlock行。然后将memcpy转换为字节,这些字节不应该是const而不是dataHandle。