C# 剪贴板复制两次

C# 剪贴板复制两次,c#,winforms,clipboard,clipboarddata,C#,Winforms,Clipboard,Clipboarddata,() 我正在制作一个剪贴板程序,它可以让你看到剪贴板上有什么 看起来是这样的: 它似乎可以很好地即时复制 问题是,我希望能够返回到剪贴板中以前的img/txt并使用它-这就是我使用复选标记按钮的时候 它可以工作,唯一的问题是它会将它复制两次到我正在使用的图像列表/列表框中。初始化listbox/picturebox时也会发生这种情况 代码如下: namespace Clipboard_Wizard { public partial class FormMain : Form { //r

()

我正在制作一个剪贴板程序,它可以让你看到剪贴板上有什么

看起来是这样的:

它似乎可以很好地即时复制

问题是,我希望能够返回到剪贴板中以前的img/txt并使用它-这就是我使用复选标记按钮的时候

它可以工作,唯一的问题是它会将它复制两次到我正在使用的图像列表/列表框中。初始化listbox/picturebox时也会发生这种情况

代码如下:

namespace Clipboard_Wizard
{
public partial class FormMain : Form
{
    //register the program in the clipboard viewer chain
    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);

    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

    private const int WM_DRAWCLIPBOARD = 0x0308;        // WM_DRAWCLIPBOARD message
    private IntPtr _clipboardViewerNext;                // Our variable that will hold the value to identify the next window in the clipboard viewer chain

    private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
    {
        ChangeClipboardChain(this.Handle, _clipboardViewerNext);        // Removes our from the chain of clipboard viewers when the form closes.
    }

    List<Image> img = new List<Image>();
    int ImgCount = 0;
    int ImgIndex = -1;
    Image tmp;

    public FormMain()
    {
        InitializeComponent();

        _clipboardViewerNext = SetClipboardViewer(this.Handle);      // Adds our form to the chain of clipboard viewers.

        //set listbox/picturebox to whatever already on clipboard
        if (Clipboard.ContainsImage())
        {
            tmp = Clipboard.GetImage();
            pictureBox1.Image = tmp;
            img.Add(tmp);
            ImgCount++;
            ImgIndex++;
            btnSlctImg.Enabled = true;
            label3.Text = "Image 1 / 1";
        }
        else if (Clipboard.ContainsText())
        {
            listBox1.Items.Add(Clipboard.GetText());
        }
    }

    // clears everything from the form and the clipboard
    private void btnClear_Click(object sender, EventArgs e)
    {
        Clipboard.Clear();
        listBox1.Items.Clear();
        img.Clear();
        pictureBox1.Image = null;
        ImgCount = 0;
        ImgIndex = -1;
        btnSlctImg.Enabled = false;
    }

    private void btnUpdate_Click(object sender, EventArgs e)
    {
        /*if (Clipboard.ContainsImage())
            {
                tmp = Clipboard.GetImage();
                pictureBox1.Image = tmp;
                img.Add(tmp);
                ImgCount++;
                ImgIndex = ImgCount - 1;  

            }
            else if (Clipboard.ContainsText())
            {
                listBox1.Items.Add(Clipboard.GetText());
                listBox1.TopIndex = listBox1.Items.Count - 1;
            }*/
    }



    private void btnUp_Click(object sender, EventArgs e)
    {
        if(ImgIndex == -1)
        {
            MessageBox.Show("No image.");
        }
        else if (ImgIndex < ImgCount - 1)
        {
            ImgIndex++;
            pictureBox1.Image = img[ImgIndex];
            label3.Text = "Image " + (ImgIndex + 1).ToString() + " / " + ImgCount.ToString() ;
        }
        else
        {
            MessageBox.Show("This is the last image.");
        }
    }

    private void btnDown_Click(object sender, EventArgs e)
    {
        if(ImgIndex == -1)
        {
            MessageBox.Show("No image.");
        }
        else if (ImgIndex > 0)
        {
            ImgIndex--;
            pictureBox1.Image = img[ImgIndex];
            label3.Text = "Image " + (ImgIndex + 1).ToString() + " / " + ImgCount.ToString();
        }
        else
        {
            MessageBox.Show("This is the first image.");
        }
    }

    private void btnDeselect_Click(object sender, EventArgs e)
    {
        listBox1.SelectedIndex = -1;
    }

    //sets clipboard to selected txt from listbox
    private void btnSlct_Click(object sender, EventArgs e)
    {
        string slctTxt = listBox1.SelectedItem.ToString();
        if (slctTxt != null || slctTxt != "")
        {
            Clipboard.SetText(slctTxt);
        }
    }

    //sets clipboard to selected image
    private void btnSlctImg_Click(object sender, EventArgs e)
    {
        Image slctImg = pictureBox1.Image;
        if (slctImg != null)
        {
            Clipboard.SetImage(slctImg); 
        }

    }

    private void listBox1_SelectedIndexChanged_1(object sender, EventArgs e)
    {
        if (listBox1.SelectedIndex != -1)
        {
            btnSlctTxt.Enabled = true;
        }
        else
        {
            btnSlctTxt.Enabled = false;
        }
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);    // Process the message 

        if (m.Msg == WM_DRAWCLIPBOARD)
        {
            //btnUpdate.PerformClick();

            IDataObject iData = Clipboard.GetDataObject();      // Clipboard's data

            if (iData.GetDataPresent(DataFormats.Text))
            {
                string text = (string)iData.GetData(DataFormats.Text);      // Clipboard text
                listBox1.Items.Add(text);
                listBox1.TopIndex = listBox1.Items.Count - 1;
            }
            else if (iData.GetDataPresent(DataFormats.Bitmap))
            {
                tmp = (Bitmap)iData.GetData(DataFormats.Bitmap);   // Clipboard image
                pictureBox1.Image = tmp;
                img.Add(tmp);
                ImgCount++;
                ImgIndex = ImgCount - 1;
                label3.Text = "Image " + ImgCount.ToString() + " / " + ImgCount.ToString();
                btnSlctImg.Enabled = true;  
            }
        }
    }

}
}
名称空间剪贴板\u向导
{
公共部分类FormMain:Form
{
//在剪贴板查看器链中注册程序
[DllImport(“User32.dll”,CharSet=CharSet.Auto)]
公共静态外部IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
[DllImport(“User32.dll”,CharSet=CharSet.Auto)]
公共静态外部bool changebloardchain(IntPtr hWndRemove、IntPtr hWndNewNext);
私有常量int WM_DRAWCLIPBOARD=0x0308;//WM_DRAWCLIPBOARD消息
private IntPtr\u clipboardViewerNext;//我们的变量,该变量将保存用于标识剪贴板查看器链中的下一个窗口的值
私有void FormMain\u FormClosing(对象发送方,FormClosingEventArgs e)
{
ChangeClipboardChain(this.Handle,_clipboardViewerNext);//在窗体关闭时从剪贴板查看器链中删除我们的。
}
List img=新列表();
int ImgCount=0;
int ImgIndex=-1;
图像tmp;
public FormMain()
{
初始化组件();
_clipboardViewerNext=SetClipboardViewer(this.Handle);//将表单添加到剪贴板查看器链中。
//将listbox/picturebox设置为剪贴板上已有的内容
if(剪贴板.ContainsImage())
{
tmp=Clipboard.GetImage();
pictureBox1.Image=tmp;
img.Add(tmp);
ImgCount++;
ImgIndex++;
btnSlctImg.Enabled=true;
label3.Text=“图像1/1”;
}
else if(剪贴板.ContainsText())
{
listBox1.Items.Add(Clipboard.GetText());
}
}
//清除表单和剪贴板中的所有内容
私有void btnClear\u单击(对象发送者,事件参数e)
{
剪贴板。清除();
listBox1.Items.Clear();
img.Clear();
pictureBox1.Image=null;
ImgCount=0;
ImgIndex=-1;
btnSlctImg.Enabled=false;
}
私有void b更新\单击(对象发送者,事件参数e)
{
/*if(剪贴板.ContainsImage())
{
tmp=Clipboard.GetImage();
pictureBox1.Image=tmp;
img.Add(tmp);
ImgCount++;
ImgIndex=ImgCount-1;
}
else if(剪贴板.ContainsText())
{
listBox1.Items.Add(Clipboard.GetText());
listBox1.TopIndex=listBox1.Items.Count-1;
}*/
}
私有无效btnUp_单击(对象发送方,事件参数e)
{
如果(ImgIndex==-1)
{
MessageBox.Show(“无图像”);
}
否则如果(ImgIndex0)
{
ImgIndex--;
pictureBox1.Image=img[ImgIndex];
label3.Text=“Image”+(ImgIndex+1.ToString()+”/“+ImgCount.ToString();
}
其他的
{
Show(“这是第一张图片”);
}
}
私有无效BTNDELECT\u单击(对象发送者,事件参数e)
{
listBox1.SelectedIndex=-1;
}
//将剪贴板设置为从列表框中选择的txt
私有无效btnSlct_单击(对象发送方,事件参数e)
{
字符串slctTxt=listBox1.SelectedItem.ToString();
如果(slctTxt!=null | | slctTxt!=“”)
{
Clipboard.SetText(slctTxt);
}
}
//将剪贴板设置为选定图像
私有无效btnSlctImg_单击(对象发送者,事件参数e)
{
图像slctImg=pictureBox1.图像;
如果(slctImg!=null)
{
剪贴板.SetImage(slctImg);
}
}
私有无效列表框1\u已选择索引已更改\u 1(对象发送方,事件参数e)
{
如果(listBox1.SelectedIndex!=-1)
{
btnSlctTxt.Enabled=true;
}
其他的
{
btnSlctTxt.Enabled=false;
}
}
受保护的覆盖无效WndProc(参考消息m)
{
base.WndProc(ref m);//处理消息
如果(m.Msg==WM_)
{
//btnUpdate.PerformClick();
IDataObject iData=Clipboard.GetDataObject();//剪贴板的数据
if(iData.GetDataPresent(DataFormats.Text))
{
string text=(string)iData.GetData(DataFormats.text);//剪贴板文本
listBox1.Items.Add(文本);
listBox1.TopIndex=listBox1.Items.Count-1;
}
else if(iData.GetDataPresent(DataFormats.Bitmap))
{
tmp=(位图)iData.GetData(DataFormats.Bitmap);//剪贴板图像
pictureBox1.Image=tmp;
img.Add(tmp);
ImgCount++;
ImgIndex=ImgCount-1;
label3.Text=“Image”+ImgCount.ToString()+“/”+ImgCount.ToString();
btnSlctImg.Enabled=true;
}
}
}
}
}
更新:问题似乎是每当我调用
Clipboard.SetImage(…)
if (slctImg != null) { Clipboard.SetImage(slctImg); }