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