Electron 是否支持将文件路径拖放到另一个应用程序中?

Does Electron support drag-and-dropping a file path into another application?

在 C# WinForms 中,我可以做到这一点

var data = new DataObject(DataFormats.FileDrop, filePaths);
myControl.DoDragDrop(data, DragDropEffects.Copy);

要使另一个应用程序(如记事本)打开filePaths指定的文件。 WPF 甚至 JavaFX 中的代码都类似。文件路径可以是系统内可访问的任意文件路径,例如C:\Windows\win.ini\myFileServer\sharedDir\sharedFile.txt。我的意思是让记事本打开文件,而不是在其编辑区域中显示文件路径文本。也就是说,我正在寻找文件路径,而不是包含文件路径的字符串。

如果我用 Electron 制作桌面应用程序,我可以做同样的事情吗(仅适用于桌面;不关心 web/mobile)?我已经用据说是用 Electron 创建的 VS Code 对其进行了测试,当我将文件从其“Explorer”拖到记事本中时,没有任何反应。当我在 Notepad++ 中输入时,它只是在其编辑区域显示文件路径字符串,所以我猜 Electron 不支持它,但我想确定一下。

是的,Electron 文档中甚至有关于此的 full example


示例代码的简短摘要:当拖动特定 DOM 元素时,渲染器会向主进程发送一个事件。要触发 dragstart 事件,DOM 元素需要具有属性 draggable="true"。在此示例中,我们将要拖动的文件的文件名在消息中传递给主进程。

document.getElementById("foo").ondragstart = event => {
    event.preventDefault();
    ipcRenderer.send("my-drag-start", "test-file.txt");
}

主进程处理来自渲染器的IPC消息并开始拖动操作。请注意,您需要在拖动操作期间指定一个要附加到光标的图标,如果遗漏会触发错误消息。

ipcMain.on("my-drag-start", (event, filePath) => {
    event.sender.startDrag({
        file: path.join(__dirname, filePath),
        icon: path.join(__dirname, "dnd.png"),
    });
});