在两个应用程序之间拖放

本文关键字:应用程序 之间 拖放 两个 | 更新日期: 2023-09-27 18:05:05

所以我真的想在一个应用程序的两个实例之间拖放数据;但是,如果在我要删除的目标点上存在数据,我希望将该数据与正在删除的数据交换。

我试图使用MemoryMappedFIle,这似乎大部分时间工作,但它并不完美。例如,如果我拖放的速度太快,目标数据就会被覆盖(我假设它没有被足够快地写入MemoryMappedFile)。有人有什么建议吗?

这是我目前拥有的:

    private void pbSprite_MouseDown(object sender, MouseEventArgs e)
    {
        PictureBox pb = (PictureBox)(sender);
        DataObject data = new DataObject();
        if (pb.Name == pbSprite.Name)
        {
            data = new DataObject(DataFormats.Serializable, frmpkm);
        }
        else
        {
            data = new DataObject(DataFormats.Serializable, frmpkm2);
        }
        pb.DoDragDrop(data, DragDropEffects.Move);
        MemoryMappedFile MemoryMapped = MemoryMappedFile.CreateOrOpen("name", 1000, MemoryMappedFileAccess.ReadWrite);
        using (MemoryMappedViewAccessor FileMap = MemoryMapped.CreateViewAccessor())
        {
            PKMDS.Pokemon otherpkm = new PKMDS.Pokemon();
            for (int i = 0; i < Marshal.SizeOf(otherpkm); i++)
            {
                FileMap.Read<byte>(i, out otherpkm.Data[i]);
            }
            if (pb.Name == pbSprite.Name)
            {
                frmpkm.Data = otherpkm.Data;
            }
            else
            {
                frmpkm2.Data = otherpkm.Data;
            }
            lblData.Text = frmpkm.SpeciesName;
            lblData2.Text = frmpkm2.SpeciesName;
            pbSprite.Image = frmpkm.Sprite;
            pbSprite2.Image = frmpkm2.Sprite;
        }
    }
    private void pbSprite_DragDrop(object sender, DragEventArgs e)
    {
        if (e.Data != null)
        {
            PictureBox pb = (PictureBox)(sender);
            PKMDS.Pokemon otherpkm = (PKMDS.Pokemon)e.Data.GetData(DataFormats.Serializable);
            MemoryMappedFile MemoryMapped = MemoryMappedFile.CreateOrOpen("name", 1000, MemoryMappedFileAccess.ReadWrite);
            using (MemoryMappedViewAccessor FileMap = MemoryMapped.CreateViewAccessor())
            {
                for (int i = 0; i < Marshal.SizeOf(frmpkm); i++)
                {
                    if (pb.Name == pbSprite.Name)
                    {
                        FileMap.Write<byte>(i, ref frmpkm.Data[i]);
                    }
                    else
                    {
                        FileMap.Write<byte>(i, ref frmpkm2.Data[i]);
                    }
                }
            }
            if (pb.Name == pbSprite.Name)
            {
                frmpkm.Data = otherpkm.Data;
            }
            else
            {
                frmpkm2.Data = otherpkm.Data;
            }
            lblData.Text = frmpkm.SpeciesName;
            lblData2.Text = frmpkm2.SpeciesName;
            pbSprite.Image = frmpkm.Sprite;
            pbSprite2.Image = frmpkm2.Sprite;
        }
    }

在两个应用程序之间拖放

可以尝试两种方法

在创建内存映射文件后将调用移动到pb.DoDragDrop(data, DragDropEffects.Move);。这将导致拖放动作的开始延迟,但应确保数据已写入文件。

另一种方法是在单独的线程中将数据写入mmf,并在写入数据时设置它和Event。然后,pbSprite_DragDrop可以等待事件发出信号,然后从文件中读取。