当前位置: 首页 > 编程语言 > C#

Clipboard.GetText会覆盖剪贴板吗?分享

时间:2023-04-10 16:50:42 C#

Clipboard.GetText会覆盖剪贴板?这是我正在尝试做的事情:当我按下Ctrl-C时,有些游戏会将鼠标光标下的项目信息写入剪贴板。我正在尝试获取此信息并从中选择我需要的内容。我这样做://在表单加载RegisterHotKey(this.Handle,0,0x002,(int)Keys.C);protectedoverridevoidWndProc(refMessagem){if(m.Msg==0x0312){intid=m.WParam.ToInt32();如果(id==0){System.Threading.Thread.Sleep(155);//我想如果我添加一些延迟它会有所帮助,但它没有...stringtextFromClipboard=Clipboard.获取文本();if(textFromClipboard.Contains("Itemlevel:")){//如果数据存在于剪贴板中,则对数据做一些事情,这对我所做的并不重要-我永远不会到达这里}}}base.WndProc(refm);所以基本上,当我在没有这个程序的情况下在游戏中按Ctrl-C-一切正常,信息被复制到剪贴板中。当我打开程序时-剪贴板与我在游戏中按下Ctrl-C之前一样。我怎样才能防止这种情况发生?如何从剪贴板正确获取文本?也许我获取此文本的方式有误?或者也许这个注册的热键干扰了游戏热键,所以它不再起作用了?更新:我找到了一些简单的解决方案,但非常粗糙和野蛮。但它工作正常。publicstaticvoidKeyDown(System.Windows.Forms.Keyskey){keybd_event((byte)key,0x45,0x0001|0,0);}publicstaticvoidKeyUp(System.Windows.Forms.Keyskey){keybd_event((byte)key,0x45,0x0001|0x0002,0);}protectedoverridevoidWndProc(refMessagem){if(m.Msg==0x0312){intid=m.WParam.ToInt32();如果(id==0){ToggleHotkeys(false);KeyDown(按键。控制);KeyDown(Keys.C);KeyUp(Keys.C);KeyUp(Keys.Control);系统.Threading.Thread.Sleep(155);//如果我评论这个睡眠-代码执行得太快,第一次按下Ctrl-C//什么都不捕获,第二次按下输出第一个项目的结果//第三次按下-第二个项目,...stringtextFromClipboard=Clipboard.GetText();(textFromClipboard.Contains("Itemlevel:")){//处理数据}ToggleHotkeys(true);}}base.WndProc(refm);也许有更聪明的方法来解决这个问题?当剪贴板发生变化时,我会使用剪贴板监视器来通知:以上是C#学习教程:WillClipboard.GetTextoverwritetheclipboard?如果分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注—使用系统;使用System.Collections.Generic;使用System.ComponentModel;使用系统数据;使用系统绘图;使用System.Linq;使用系统文本;使用System.Threading.Tasks;使用System.Windows.Forms;使用System.Runtime.InteropServices;namespaceWindowsFormsApplication1{publicpartialclassForm1:Form{privateClipBoardMonitorcbm=null;publicForm1(){InitializeComponent();cbm=newClipBoardMonitor();cbm.NewText+=cbm_NewText;}privatevoidcbm_NewText(stringtxt){Console.WriteLine(txt);}}publicclassClipBoardMonitor:NativeWindow{privateconstintWM_DESTROY=0x2;私有常量intWM_DRAWCLIPBOARD=0x308;私有常量intWM_CHANGECBCHAIN=0x30d;[DllImport("user32.dll")]staticexternIntPtrSetClipboardViewer(IntPtrhWndNewViewer);[DllImport("user32.dll")]staticexternboolChangeClipboardChain(IntPtrhWndRemove,IntPtrhWndNewNext);[DllImport("user32.dll",CharSet=CharSet.Auto)]privatestaticexternIntPtrSendMessage(IntPtrhWnd,intMsg,IntPtrwParam,IntPtrlParam);公共事件NewTextEventHandlerNewText;公共委托voidNewTextEventHandler(stringtxt);私有IntPtrNextClipBoardViewerHandle;publicClipBoardMonitor(){this.CreateHandle(newCreateParams());NextClipBoardViewerHandle=SetClipboardViewer(this.Handle);}protectedoverridevoidWndProc(refMessagem){switch(m.Msg){caseWM_DRAWCLIPBOARD:if(Clipboard.ContainsText()){if(NewText!=null){NewText(Clipboard.GetText());}}SendMessage(NextClipBoardViewerHandle,m.Msg,m.WParam,m.LParam);休息;caseWM_CHANGECBCHAIN:if(m.WParam.Equals(NextClipBoardViewerHandle)){NextClipBoardViewerHandle=m.LParam;}elseif(!NextClipBoardViewerHandle.Equals(IntPtr.Zero)){SendMessage(NextClipBoardViewerHandle,m.Msg,m.WParam,m.LParam);}休息;案例WM_DESTROY:ChangeClipboardChain(this.Handle,NextClipBoardViewerHandle);休息;}base.WndProc(参考米);}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: