使用 C# 和 Windows Forms 在 .NET 中增强剪贴板管理器






4.20/5 (4投票s)
2007年4月26日
6分钟阅读

52797

1470
更好的剪贴板管理器
引言
对于大多数程序员来说,复制和粘贴是日常任务。
但是 Windows 的剪贴板让我们的复制和粘贴工作变得更加困难。
它不支持排队、保存剪贴板数据、显示复制发生的时间、从中复制数据的应用程序名称、访问远程计算机的剪贴板等。我认为最好设计一个应用程序,让数据复制和粘贴稍微容易一些。因此,我使用 C# 和 Windows Forms 在 VS.NET 2003 中设计了这个应用程序。我将首先解释该应用程序提供的功能,然后介绍其设计和编码。
此应用程序具有的功能
- 它允许我们对所有剪贴板数据进行排队。
- 它允许我们将整个剪贴板数据保存到文件等永久存储中。
- 显示将数据复制到剪贴板的时间。
- 显示从中复制数据到剪贴板的应用程序图标。
- 它允许我们访问任何远程计算机的剪贴板。
- 易于使用的用户界面。
- 现在,剪贴板数据只需点击一下即可获得。
现在,在 VS.NET 2003 中使用 C# 创建一个新的 Windows 应用程序,并将其命名为 ClipBoardWatcher。将控件添加到主窗体 (Form1) 中,如下图所示
在此,我设置了 Form1 的以下属性
- 位置 -> 850, 0
- 不透明度 -> 50%
- 大小 -> 176, 738 且
- KeyPreview -> True。
我还在两个上下文菜单之后放置了一个 Tooltip 和 NotifyIcon。一个上下文菜单分配给了 Form1(分配给窗体上显示的每个剪贴板项按钮),另一个分配给了 NotifyIcon。
以下是 cxtmnuclip 上下文菜单(分配给 Form1 的剪贴板项)中存在的菜单项
- 复制到剪贴板(用于将选定的剪贴板项从应用程序复制到剪贴板)。
- 删除此剪贴板数据(从应用程序中删除选定的剪贴板项)。
- 删除所有剪贴板项(从应用程序中删除所有剪贴板项)。
- 将项保存到文件(将应用程序的内容(剪贴板项)保存到文件以供进一步参考)。
以下是 cxttaskbar 上下文菜单(分配给 NotifyIcon)中存在的菜单项
此上下文菜单中的所有菜单项都与应用程序的用户界面设置有关
- 显示/隐藏用于显示或隐藏应用程序。
- 显示在任务栏上允许我们设置应用程序是否应显示在任务栏上。
- 显示在顶部允许我们设置应用程序是否应显示在所有窗口之上。
- 控制窗体厚度允许我们增加或减小主窗体的厚度(不透明度)。
- 显示控件框允许我们设置应用程序是否应显示控件框。
- 退出用于结束应用程序的执行。
此应用程序的主要功能是,每当您将新数据复制到剪贴板时,它都会在主窗体上创建一个按钮。此外,它将通过使用 System.Threading.Timer 对象每秒监控系统剪贴板的内容,显示从中复制数据到剪贴板的应用程序的图标以及复制时间。
然后,我添加了一个名为 _frmnewprcdetails.cs_ 的窗体,用于获取远程计算机的 IP 地址以监控其剪贴板。然后,我在 _Form1.cs_ 中添加了一个名为 RemoteClipboard
的类,用于在剪贴板数据发生更改时调用远程方法。在此类中,我使用两个方法来发送和接收剪贴板数据。每当剪贴板的内容发生更改时,它都会将更新后的内容发送到远程计算机。在远程计算机上,一个应用程序会将剪贴板设置为收到的内容。这样,我们就可以轻松地用我们系统的内容更新远程计算机的剪贴板。为了访问远程计算机的剪贴板,我们必须在该计算机上拥有管理员(或同等)权限。
现在我将解释该应用程序的编码部分。
我在应用程序中添加了三个类文件。我将概述每个类文件的功能。
ClipBoardItems.cs 中存在的功能
为了创建每个剪贴板项的按钮,我实现了 VB 中的控件数组。在这里,我只是创建了一个名为 ClipBoardItems
的类,它继承自 System.Collections.CollectionBase
。在此类的构造函数中,我将容器(Form1)传递给这些按钮。然后我添加了五个方法:实现添加新按钮(剪贴板项)、删除选定的剪贴板项、从应用程序中删除所有剪贴板项、将所有项保存到文件以及处理按钮单击。
在 AddNewClipItem()
中,我创建了一个新按钮,并将其 Text 属性设置为剪贴板数据的内容。我还设置了宽度、高度以及从中复制数据到剪贴板的应用程序图标等属性。
APIFuncs.cs 中存在的功能
在此类中,我使用 Windows API 方法从从中复制数据到剪贴板的应用程序获取 .exe 路径。实际上,我通过使用 GetForegroundWindow()
获取复制数据从中复制的窗口的句柄,然后将该句柄传递给 GetWindowProcessID()
以获取进程 ID。然后,我将此进程 ID 传递给 GetProcessById()
以获取从中复制数据的进程。最后,我通过使用进程的 MainModule
属性获取执行进程(通过调用 GetProcessById()
创建的进程)的物理路径。
ActiveApplicationIcon.cs 中存在的功能
在此类中,我使用 GetApplnIcon()
获取从中复制数据到进程的图标。其背后的逻辑是,每秒一次,System.Threading
的计时器对象会检查系统剪贴板的内容。如果其内容已更改,它将获取当前焦点窗口(从中复制数据到窗口)的图标,并将其设置为一个新创建的按钮,该按钮的文本为剪贴板内容,图像为从中复制到剪贴板的应用程序的图标。我们通过将进程 MainModule 的物理路径传递给 ActiveApplicationIcon
类的 GetApplnIcon()
来获取应用程序的图标。
我们可以使用 Windows API 方法在剪贴板更改时获取数据,而不是使用计时器对象。如果使用这些 Windows API 方法,那么此应用程序中的大部分代码将不是 C# 代码(代码将仅包含 API 调用),并且很难理解该应用程序。性能方面,使用计时器对象或 Windows API 之间不会有太大差异。由于我们使用的是 System.Threading 的计时器,因此不会消耗大量资源。如果您愿意,仍然可以使用 Windows API。
最后,我添加了一些代码来增强应用程序的用户界面。最终的输出将是这样的
<
我们仍然可以通过改进用户界面来增强此应用程序。
使用此应用程序,您将永远不会丢失剪贴板数据。而且,它只需点击一下即可获得。我附上了源代码供进一步参考。希望这些代码对所有人都有用。