如何从任意应用程序中添加选定文本到Windows窗体应用程序这就是我想做的,当用户选择任意一个单词(文本)的时候通过双击鼠标任何正在运行的应用程序,特定突出显示的单词应该插入到已经运行的Windows应用程序中。到目前为止,我已经使用GlobalKeystroke实现了逻辑,用户必须触发CRT+C键盘组合才能将所选单词复制到win窗体应用程序中。我想知道的是,有没有一种方法可以在不按键盘键的情况下将选定的文本输入到应用程序中?阅读之后,我找到了方法:使用globalmousekeyhook.codeplex.com之类的东西挂钩双击事件(可选)保存剪贴板的当前状态从user32.dll获取当前鼠标位置使用WindowFromPoint从user32.dll获取光标位置获取窗口[DllImport("user32.dll")]publicstaticexternIntPtrWindowFromPoint(PointlpPoint);[DllImport("user32.dll")]publicstaticexternboolGetCursorPos(outPointlpPoint);publicstaticIntPtrGetWindowUnderCursor(){PointptCursor=newPoint();如果(!(PInvoke.GetCursorPos(outptCursor)))返回IntPtr.Zero;返回WindowFromPoint(ptCursor);}使用SendMessage表单user32.dll发送复制命令(请参阅使用User32.dllSendMessage发送带有ALT修饰符的键)您的代码(可选)恢复步骤2中保存的剪贴板内容我为我的项目实现了这个。好的,我该怎么做,让我解释一下。应该考虑两件大事。所以,@jcrada的回答包含一个很好的观点,即选项1。按照上面的方法,步骤一定是:首先,创建一个包含剪贴板事件的Win32帮助类。//////此静态类包含///此示例应用程序所需的Win32函数声明和常量。///internalstaticclassWin32{//////WM_DRAWCLIPBOARD消息通知剪贴板查看器窗口///剪贴板的内容已更改。///内部常量intWmDrawclipboard=0x0308;//////当///另一个窗口从剪贴板查看器链中删除自身时,剪贴板查看器窗口会收到WM_CHANGECBCHAIN消息。///内部常量intWmChangecbchain=0x030D;[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)]internalstaticexternIntPtrSetClipboardViewer(IntPtrhWndNewViewer);[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)]internalstaticexternboolChangeClipboardChain(IntPtrhWndRemove,IntPtrhWndNewNext);[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)]internalstaticexternIntPtrSendMessage(IntPtrhWnd,int消息,IntPtrwParam,IntPtrlParam);}其次,注册鼠标和剪贴板事件,publicvoidInitialize(){varwih=newWindowInteropHelper(this.mainWindow);this.hWndSource=HwndSource.FromHwnd(wih.Handle);this.globalMouseHook=Hook.GlobalEvents();this.mainWindow.CancellationTokenSource=newCancellationTokenSource();varsource=this.hWndSource;如果(源!=null){source.AddHook(this.WinProc);//开始处理窗口消息this.hWndNextViewer=Win32.SetClipboardViewer(source.Handle);//将此窗口设置为查看器}this.SubscribeLocalevents();this.growlNotifications.Top=SystemParameters.WorkArea.Top+this.startupConfiguration.TopOffset;this.growlNotifications.Left=SystemParameters.WorkArea.Left+SystemParameters.WorkArea.Width-this.startupConfiguration.LeftOffset;this.IsInitialized=true;}鼠标事件;privatevoidSubscribeLocalevents(){this.globalMouseHook.MouseDoubleClick+=async(o,args)=>awaitthis.MouseDoubleClicked(o,args);this.globalMouseHook.MouseDown+=async(o,args)=>awaitthis.MouseDown(o,args);this.globalMouseHook.MouseUp+=async(o,args)=>awaitthis.MouseUp(o,args);}privateasyncTaskMouseUp(objectsender,MouseEventArgse){this.mouseSecondPoint=e.Location;if(this.isMouseDown&&!this.mouseSecondPoint.Equals(this.mouseFirstPoint)){awaitTask.Run(()=>{if(this.mainWindow.CancellationTokenSource.Token.IsCancellationRequested)返回;SendKeys.SendWait("^c");});this.isMouseDown=false;}this.isMouseDown=false;}privateasyncTaskMouseDown(objectsender,MouseEventArgse){awaitTask.Run(()=>{if(this.mainWindow.CancellationTokenSource.Token.IsCancellationRequested)return;this.mouseFirstPoint=e.Location;this.isMouseDown=true;});}privateasyncTaskMouseDoubleClicked(objectsender,MouseEventArgse){this.isMouseDown=false;awaitTask.Run(()=>{if(this.mainWindow.CancellationTokenSource.Token.IsCancellat离子请求)返回;SendKeys.SendWait("^c");});}最后一部分,当我们抓住时,我们会做些什么this.hWndNextViewer)this.hWndNextViewer=lParam;//剪贴板查看器链已更改,需要修复它。elseif(this.hWndNextViewer!=IntPtr.Zero)Win32.SendMessage(this.hWndNextViewer,msg,wParam,lParam);//将消息传递给下一个观众。休息;caseWin32.WmDrawclipboard:Win32.SendMessage(this.hWndNextViewer,msg,wParam,lParam);//将消息传递给下一个查看者//剪贴板内容已更改,(Action)delegate{varcurrentText=Clipboard.GetText().RemoveSpecialCharacters();if(!string.IsNullOrEmpty(currentText)){//在这一节中,我们正在做一些事情ing,因为文本被捕获。任务。Run(async()=>{if(this.mainWindow.CancellationTokenSource.Token.IsCancellationRequested)return;awaitthis.WhenClipboardContainsTextEventHandler.);}});}休息;}返回IntPtr.Zero;诀窍是将复制命令发送到窗口或操作系统,另一方面是Control+C命令,所以SendKeys.SendWait("^c");执行上述操作是C#LearningTutorial:HowtoaddselectedtextfromanyapplicationtoallcontentsharedinWindowsFormsapplications。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
