我有一个查看剪贴板的简单脚本。一旦它被改变,它会抛出一个事件,查看包含的文本并使用该文本来填充数据网格。我无法访问自定义事件中的数据网格
事件工作正常,按预期方式检索文本,但是当我尝试向数据网格添加一行时,什么都不会发生。任何建议?
public void ClipBoardHasChanged(ClipboardMonitor m, ClipboardChangedEventArgs e)
{
string clipBoardValue = (string)e.ClipboardChangedEventArgsT.GetData(DataFormats.StringFormat, true);
this.dataGridView1.Rows.Add();
this.dataGridView1.Rows[0].Cells[0].Value = clipBoardValue;
}
剪贴板
namespace MarketMatrixCorrelation
{
[DefaultEvent("ClipboardChanged")]
public class ClipboardMonitor : Control
{
IntPtr nextClipboardViewer;
[DllImport("User32.dll")]
protected static extern int SetClipboardViewer(int hWndNewViewer);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
public ClipboardMonitor()
{
this.BackColor = System.Drawing.Color.Red;
this.Visible = false;
nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle);
}
/// <summary>
/// Clipboard contents changed.
/// </summary>
public delegate void ClipboardChanged(ClipboardMonitor s, ClipboardChangedEventArgs e);
public event ClipboardChanged ClipboardChangedT = delegate { };
protected override void Dispose(bool disposing)
{
ChangeClipboardChain(this.Handle, nextClipboardViewer);
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
// defined in winuser.h
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x030D;
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
OnClipboardChanged();
break;
case WM_CHANGECBCHAIN:
if (m.WParam == nextClipboardViewer)
nextClipboardViewer = m.LParam;
else
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
default:
base.WndProc(ref m);
break;
}
}
//Catch when something is posted on the clipboard
private void OnClipboardChanged()
{
try
{
ClipboardChangedEventArgs iData = new ClipboardChangedEventArgs();
iData.ClipboardChangedEventArgsT = Clipboard.GetDataObject();
if (iData.ClipboardChangedEventArgsT.GetDataPresent(DataFormats.StringFormat))
{
ClipboardChangedT(this, iData);
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
}
public class ClipboardChangedEventArgs : EventArgs
{
private IDataObject DataObject;
public IDataObject ClipboardChangedEventArgsT
{
set
{
DataObject = value;
}
get
{
return this.DataObject;
}
}
}
}
是正确的。这只是为了展示我的成就。唯一的问题是没有任何反应! datagridview中没有添加任何内容。 – 2013-02-25 12:15:10
我道歉我删除了我的评论..试试我的回答,你在winform? – spajce 2013-02-25 12:16:52
不用担心。是的,我在winform。我的事件是在一个单独的类,但它似乎正常工作(即,如果我复制到剪贴板像“aaaa”字符串变量clipBoardValue反映相反“aaaa”)。 – 2013-02-25 12:20:05