Sicherung

This commit is contained in:
Maier Stephan SI
2023-04-17 07:07:49 +02:00
parent f3f89b94f5
commit 1c68b8f401
1307 changed files with 7918 additions and 82491 deletions

63
SharpClipboard/.gitattributes vendored Normal file
View File

@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

12
SharpClipboard/.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: ['https://www.buymeacoffee.com/willykimura']

262
SharpClipboard/.gitignore vendored Normal file
View File

@@ -0,0 +1,262 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
*.nuspec
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
project.fragment.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
#*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

111
SharpClipboard/README.md Normal file
View File

@@ -0,0 +1,111 @@
# SharpClipboard
[![nuget-downloads](https://img.shields.io/nuget/dt/SharpClipboard?label=Downloads)](https://www.nuget.org/packages/SharpClipboard/) [![wk-donate](https://img.shields.io/badge/BuyMeACoffee-Donate-orange.svg)](https://www.buymeacoffee.com/willykimura)
**SharpClipboard** is a clipboard-monitoring library for .NET that listens to the system's clipboard entries,
allowing developers to tap into the rich capabilities of determining the clipboard's contents at runtime.
Here's a screenshot and below a usage-preview of the library's features:
![sc-preview-01](/Assets/sharpclipboard-preview-01.png)
![sc-usage](/Assets/sharpclipboard-usage-01.gif)
# Installation
To install via the [NuGet Package Manager](https://www.nuget.org/packages/SharpClipboard/) Console, run:
> `Install-Package SharpClipboard`
# Features
- Supports [.NET Framework 2.0](https://www.microsoft.com/en-us/download/details.aspx?id=6523) and above plus [.NET Core](https://dotnet.microsoft.com/download).
- Built as a component making it accessible in Design Mode.
- Silently monitors the system clipboard uninterrupted; can also be disabled while running.
- Provides support for multi-instance clipboard monitoring.
- Ability to detect clipboard content in various formats: **text**, **images**, **files**, and **other complex types**.
- Option to control the type of content to be monitored, e.g. **text** only, **text** and **images** only.
- Ability to capture the background application's details from where the clipboard's contents were captured.
# Usage
If you prefer working with the Designer, simply add the library to Visual Studio's Toolbox and use the
*Properties* window to change its options:
![sc-preview-02](/Assets/sharpclipboard-preview-02.png)
To use it in code, first import `WK.Libraries.SharpClipboardNS` - the code below will then assist you:
```c#
var clipboard = new SharpClipboard();
// Attach your code to the ClipboardChanged event to listen to cuts/copies.
clipboard.ClipboardChanged += ClipboardChanged;
private void ClipboardChanged(Object sender, ClipboardChangedEventArgs e)
{
// Is the content copied of text type?
if (e.ContentType == SharpClipboard.ContentTypes.Text)
{
// Get the cut/copied text.
Debug.WriteLine(clipboard.ClipboardText);
}
// Is the content copied of image type?
else if (e.ContentType == SharpClipboard.ContentTypes.Image)
{
// Get the cut/copied image.
Image img = clipboard.ClipboardImage;
}
// Is the content copied of file type?
else if (e.ContentType == SharpClipboard.ContentTypes.Files)
{
// Get the cut/copied file/files.
Debug.WriteLine(clipboard.ClipboardFiles.ToArray());
// ...or use 'ClipboardFile' to get a single copied file.
Debug.WriteLine(clipboard.ClipboardFile);
}
// If the cut/copied content is complex, use 'Other'.
else if (e.ContentType == SharpClipboard.ContentTypes.Other)
{
// Do something with 'clipboard.ClipboardObject' or 'e.Content' here...
}
}
```
You can also get the details of the application from where the clipboard's contents were cut/copied from using the `ClipboardChanged` argument property `SourceApplication`:
```c#
private void ClipboardChanged(Object sender, SharpClipboard.ClipboardChangedEventArgs e)
{
// Gets the application's executable name.
Debug.WriteLine(e.SourceApplication.Name);
// Gets the application's window title.
Debug.WriteLine(e.SourceApplication.Title);
// Gets the application's process ID.
Debug.WriteLine(e.SourceApplication.ID.ToString());
// Gets the application's executable path.
Debug.WriteLine(e.SourceApplication.Path);
}
```
This option could come in handy especially when you're building a clipboard-monitoring application where users may feel the need to know where every recorded cut/copy action occurred.
To manually parse the content after a cut/copy has been detected, you can use the argument property `e.Content` in the `ClipboardChanged` event:
```c#
private void ClipboardChanged(Object sender, ClipboardChangedEventArgs e)
{
// For texts...
string text = e.Content.ToString();
// or images...
Image img = (Image)e.Content;
// or files...
List<string> files = (List<string>)e.Content;
// or other complex types too.
// Person p = JsonConvert.DeserializeObject<Person>(e.Content);
}
```
<hr>
*Made with* 💛 *by* [*Willy Kimura*]([https://github.com/Willy-Kimura) | *Like to say thank you?* ***Star*** *this project. Feel free to [BuyMeACoffee](https://www.buymeacoffee.com/willykimura) also.* 😊

View File

@@ -0,0 +1,442 @@
using WK.Libraries.SharpClipboardNS;
namespace SharpClipboard.Tests.NetCoreWinForms
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.chkMonitorClipboard = new System.Windows.Forms.CheckBox();
this.lblTitle = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.lblOptions = new System.Windows.Forms.Label();
this.grpLibrarySettings = new System.Windows.Forms.GroupBox();
this.grpObservableFormats = new System.Windows.Forms.GroupBox();
this.lblObservableFilesDesc = new System.Windows.Forms.Label();
this.chkObserveFiles = new System.Windows.Forms.CheckBox();
this.lblObservableImagesDesc = new System.Windows.Forms.Label();
this.chkObserveImages = new System.Windows.Forms.CheckBox();
this.lblObservableTextsDesc = new System.Windows.Forms.Label();
this.chkObserveTexts = new System.Windows.Forms.CheckBox();
this.txtCopiedTexts = new System.Windows.Forms.TextBox();
this.panel2 = new System.Windows.Forms.Panel();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.panel3 = new System.Windows.Forms.Panel();
this.pbCopiedImage = new System.Windows.Forms.PictureBox();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.panel4 = new System.Windows.Forms.Panel();
this.lstCopiedFiles = new System.Windows.Forms.ListBox();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.sharpClipboard1 = new WK.Libraries.SharpClipboardNS.SharpClipboard(this.components);
this.panel1.SuspendLayout();
this.grpLibrarySettings.SuspendLayout();
this.grpObservableFormats.SuspendLayout();
this.panel2.SuspendLayout();
this.panel3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCopiedImage)).BeginInit();
this.panel4.SuspendLayout();
this.SuspendLayout();
//
// chkMonitorClipboard
//
this.chkMonitorClipboard.AutoSize = true;
this.chkMonitorClipboard.Checked = true;
this.chkMonitorClipboard.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkMonitorClipboard.Font = new System.Drawing.Font("Segoe UI Semibold", 9.75F);
this.chkMonitorClipboard.ForeColor = System.Drawing.Color.Black;
this.chkMonitorClipboard.Location = new System.Drawing.Point(17, 33);
this.chkMonitorClipboard.Name = "chkMonitorClipboard";
this.chkMonitorClipboard.Size = new System.Drawing.Size(138, 21);
this.chkMonitorClipboard.TabIndex = 1;
this.chkMonitorClipboard.Text = "Monitor Clipboard";
this.chkMonitorClipboard.UseVisualStyleBackColor = true;
this.chkMonitorClipboard.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
//
// lblTitle
//
this.lblTitle.AutoSize = true;
this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 15.75F);
this.lblTitle.ForeColor = System.Drawing.Color.DodgerBlue;
this.lblTitle.Location = new System.Drawing.Point(22, 14);
this.lblTitle.Name = "lblTitle";
this.lblTitle.Size = new System.Drawing.Size(155, 30);
this.lblTitle.TabIndex = 3;
this.lblTitle.Text = "SharpClipboard";
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.White;
this.panel1.Controls.Add(this.lblOptions);
this.panel1.Controls.Add(this.grpLibrarySettings);
this.panel1.Controls.Add(this.lblTitle);
this.panel1.Dock = System.Windows.Forms.DockStyle.Left;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(312, 397);
this.panel1.TabIndex = 4;
//
// lblOptions
//
this.lblOptions.AutoSize = true;
this.lblOptions.Font = new System.Drawing.Font("Segoe UI Semibold", 15.75F);
this.lblOptions.ForeColor = System.Drawing.Color.Black;
this.lblOptions.Location = new System.Drawing.Point(171, 14);
this.lblOptions.Name = "lblOptions";
this.lblOptions.Size = new System.Drawing.Size(89, 30);
this.lblOptions.TabIndex = 6;
this.lblOptions.Text = "Options";
//
// grpLibrarySettings
//
this.grpLibrarySettings.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpLibrarySettings.Controls.Add(this.grpObservableFormats);
this.grpLibrarySettings.Controls.Add(this.chkMonitorClipboard);
this.grpLibrarySettings.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.grpLibrarySettings.ForeColor = System.Drawing.SystemColors.ActiveCaption;
this.grpLibrarySettings.Location = new System.Drawing.Point(26, 57);
this.grpLibrarySettings.Name = "grpLibrarySettings";
this.grpLibrarySettings.Size = new System.Drawing.Size(261, 327);
this.grpLibrarySettings.TabIndex = 5;
this.grpLibrarySettings.TabStop = false;
this.grpLibrarySettings.Text = "Change library settings";
//
// grpObservableFormats
//
this.grpObservableFormats.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpObservableFormats.Controls.Add(this.lblObservableFilesDesc);
this.grpObservableFormats.Controls.Add(this.chkObserveFiles);
this.grpObservableFormats.Controls.Add(this.lblObservableImagesDesc);
this.grpObservableFormats.Controls.Add(this.chkObserveImages);
this.grpObservableFormats.Controls.Add(this.lblObservableTextsDesc);
this.grpObservableFormats.Controls.Add(this.chkObserveTexts);
this.grpObservableFormats.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.grpObservableFormats.ForeColor = System.Drawing.SystemColors.ActiveCaption;
this.grpObservableFormats.Location = new System.Drawing.Point(17, 74);
this.grpObservableFormats.Name = "grpObservableFormats";
this.grpObservableFormats.Size = new System.Drawing.Size(229, 238);
this.grpObservableFormats.TabIndex = 6;
this.grpObservableFormats.TabStop = false;
this.grpObservableFormats.Text = "Observable Formats";
//
// lblObservableFilesDesc
//
this.lblObservableFilesDesc.AutoSize = true;
this.lblObservableFilesDesc.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold);
this.lblObservableFilesDesc.ForeColor = System.Drawing.Color.Gray;
this.lblObservableFilesDesc.Location = new System.Drawing.Point(33, 184);
this.lblObservableFilesDesc.Name = "lblObservableFilesDesc";
this.lblObservableFilesDesc.Size = new System.Drawing.Size(176, 30);
this.lblObservableFilesDesc.TabIndex = 11;
this.lblObservableFilesDesc.Text = "Monitors any files/directories \r\nthat are copied to the clipboard.";
//
// chkObserveFiles
//
this.chkObserveFiles.AutoSize = true;
this.chkObserveFiles.Checked = true;
this.chkObserveFiles.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkObserveFiles.Font = new System.Drawing.Font("Segoe UI Semibold", 9.75F);
this.chkObserveFiles.ForeColor = System.Drawing.Color.Black;
this.chkObserveFiles.Location = new System.Drawing.Point(17, 163);
this.chkObserveFiles.Name = "chkObserveFiles";
this.chkObserveFiles.Size = new System.Drawing.Size(53, 21);
this.chkObserveFiles.TabIndex = 10;
this.chkObserveFiles.Text = "Files";
this.chkObserveFiles.UseVisualStyleBackColor = true;
this.chkObserveFiles.CheckedChanged += new System.EventHandler(this.chkObserveFiles_CheckedChanged);
//
// lblObservableImagesDesc
//
this.lblObservableImagesDesc.AutoSize = true;
this.lblObservableImagesDesc.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold);
this.lblObservableImagesDesc.ForeColor = System.Drawing.Color.Gray;
this.lblObservableImagesDesc.Location = new System.Drawing.Point(33, 120);
this.lblObservableImagesDesc.Name = "lblObservableImagesDesc";
this.lblObservableImagesDesc.Size = new System.Drawing.Size(164, 30);
this.lblObservableImagesDesc.TabIndex = 9;
this.lblObservableImagesDesc.Text = "Monitors any images that are \r\ncopied to the clipboard.";
//
// chkObserveImages
//
this.chkObserveImages.AutoSize = true;
this.chkObserveImages.Checked = true;
this.chkObserveImages.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkObserveImages.Font = new System.Drawing.Font("Segoe UI Semibold", 9.75F);
this.chkObserveImages.ForeColor = System.Drawing.Color.Black;
this.chkObserveImages.Location = new System.Drawing.Point(17, 99);
this.chkObserveImages.Name = "chkObserveImages";
this.chkObserveImages.Size = new System.Drawing.Size(71, 21);
this.chkObserveImages.TabIndex = 8;
this.chkObserveImages.Text = "Images";
this.chkObserveImages.UseVisualStyleBackColor = true;
this.chkObserveImages.CheckedChanged += new System.EventHandler(this.chkObserveImages_CheckedChanged);
//
// lblObservableTextsDesc
//
this.lblObservableTextsDesc.AutoSize = true;
this.lblObservableTextsDesc.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold);
this.lblObservableTextsDesc.ForeColor = System.Drawing.Color.DimGray;
this.lblObservableTextsDesc.Location = new System.Drawing.Point(33, 54);
this.lblObservableTextsDesc.Name = "lblObservableTextsDesc";
this.lblObservableTextsDesc.Size = new System.Drawing.Size(151, 30);
this.lblObservableTextsDesc.TabIndex = 7;
this.lblObservableTextsDesc.Text = "Monitors any texts that are \r\ncopied to the clipboard.";
//
// chkObserveTexts
//
this.chkObserveTexts.AutoSize = true;
this.chkObserveTexts.Checked = true;
this.chkObserveTexts.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkObserveTexts.Font = new System.Drawing.Font("Segoe UI Semibold", 9.75F);
this.chkObserveTexts.ForeColor = System.Drawing.Color.Black;
this.chkObserveTexts.Location = new System.Drawing.Point(17, 33);
this.chkObserveTexts.Name = "chkObserveTexts";
this.chkObserveTexts.Size = new System.Drawing.Size(58, 21);
this.chkObserveTexts.TabIndex = 1;
this.chkObserveTexts.Text = "Texts";
this.chkObserveTexts.UseVisualStyleBackColor = true;
this.chkObserveTexts.CheckedChanged += new System.EventHandler(this.chkObserveTexts_CheckedChanged);
//
// txtCopiedTexts
//
this.txtCopiedTexts.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtCopiedTexts.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txtCopiedTexts.Location = new System.Drawing.Point(8, 69);
this.txtCopiedTexts.Multiline = true;
this.txtCopiedTexts.Name = "txtCopiedTexts";
this.txtCopiedTexts.Size = new System.Drawing.Size(236, 314);
this.txtCopiedTexts.TabIndex = 5;
//
// panel2
//
this.panel2.BackColor = System.Drawing.Color.Honeydew;
this.panel2.Controls.Add(this.label1);
this.panel2.Controls.Add(this.txtCopiedTexts);
this.panel2.Controls.Add(this.label2);
this.panel2.Dock = System.Windows.Forms.DockStyle.Left;
this.panel2.Location = new System.Drawing.Point(312, 0);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(252, 397);
this.panel2.TabIndex = 6;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Segoe UI", 15.75F);
this.label1.ForeColor = System.Drawing.Color.Black;
this.label1.Location = new System.Drawing.Point(25, 14);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(130, 30);
this.label1.TabIndex = 7;
this.label1.Text = "Copied Texts";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold);
this.label2.Location = new System.Drawing.Point(27, 43);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(99, 15);
this.label2.TabIndex = 8;
this.label2.Text = "will appear here...";
//
// panel3
//
this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(234)))), ((int)(((byte)(255)))));
this.panel3.Controls.Add(this.pbCopiedImage);
this.panel3.Controls.Add(this.label3);
this.panel3.Controls.Add(this.label4);
this.panel3.Dock = System.Windows.Forms.DockStyle.Left;
this.panel3.Location = new System.Drawing.Point(564, 0);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(252, 397);
this.panel3.TabIndex = 7;
//
// pbCopiedImage
//
this.pbCopiedImage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pbCopiedImage.BackColor = System.Drawing.Color.Transparent;
this.pbCopiedImage.Image = null;
this.pbCopiedImage.Location = new System.Drawing.Point(7, 69);
this.pbCopiedImage.Name = "pbCopiedImage";
this.pbCopiedImage.Size = new System.Drawing.Size(237, 313);
this.pbCopiedImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbCopiedImage.TabIndex = 9;
this.pbCopiedImage.TabStop = false;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Font = new System.Drawing.Font("Segoe UI", 15.75F);
this.label3.ForeColor = System.Drawing.Color.Black;
this.label3.Location = new System.Drawing.Point(25, 14);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(163, 30);
this.label3.TabIndex = 7;
this.label3.Text = "Copied Image(s)";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold);
this.label4.Location = new System.Drawing.Point(27, 43);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(99, 15);
this.label4.TabIndex = 8;
this.label4.Text = "will appear here...";
//
// panel4
//
this.panel4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.panel4.BackColor = System.Drawing.Color.Ivory;
this.panel4.Controls.Add(this.lstCopiedFiles);
this.panel4.Controls.Add(this.label5);
this.panel4.Controls.Add(this.label6);
this.panel4.Location = new System.Drawing.Point(816, 0);
this.panel4.Name = "panel4";
this.panel4.Size = new System.Drawing.Size(252, 397);
this.panel4.TabIndex = 8;
//
// lstCopiedFiles
//
this.lstCopiedFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lstCopiedFiles.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.lstCopiedFiles.FormattingEnabled = true;
this.lstCopiedFiles.HorizontalScrollbar = true;
this.lstCopiedFiles.Location = new System.Drawing.Point(8, 69);
this.lstCopiedFiles.Name = "lstCopiedFiles";
this.lstCopiedFiles.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
this.lstCopiedFiles.Size = new System.Drawing.Size(236, 314);
this.lstCopiedFiles.TabIndex = 11;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Font = new System.Drawing.Font("Segoe UI", 15.75F);
this.label5.ForeColor = System.Drawing.Color.Black;
this.label5.Location = new System.Drawing.Point(25, 14);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(136, 30);
this.label5.TabIndex = 7;
this.label5.Text = "Copied File(s)";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold);
this.label6.Location = new System.Drawing.Point(27, 43);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(99, 15);
this.label6.TabIndex = 8;
this.label6.Text = "will appear here...";
//
// sharpClipboard1
//
this.sharpClipboard1.MonitorClipboard = true;
this.sharpClipboard1.ObservableFormats.All = true;
this.sharpClipboard1.ObservableFormats.Files = true;
this.sharpClipboard1.ObservableFormats.Images = true;
this.sharpClipboard1.ObservableFormats.Others = true;
this.sharpClipboard1.ObservableFormats.Texts = true;
this.sharpClipboard1.ObserveLastEntry = true;
this.sharpClipboard1.Tag = null;
this.sharpClipboard1.ClipboardChanged += new System.EventHandler<WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChangedEventArgs>(this.sharpClipboard1_ClipboardChanged);
this.sharpClipboard1.MonitorClipboardChanged += new System.EventHandler<System.EventArgs>(this.sharpClipboard1_MonitorClipboardChanged);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1068, 397);
this.Controls.Add(this.panel4);
this.Controls.Add(this.panel3);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panel1);
this.Name = "MainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "SharpClipboard: Tests";
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.grpLibrarySettings.ResumeLayout(false);
this.grpLibrarySettings.PerformLayout();
this.grpObservableFormats.ResumeLayout(false);
this.grpObservableFormats.PerformLayout();
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
this.panel3.ResumeLayout(false);
this.panel3.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCopiedImage)).EndInit();
this.panel4.ResumeLayout(false);
this.panel4.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private WK.Libraries.SharpClipboardNS.SharpClipboard sharpClipboard1;
private System.Windows.Forms.CheckBox chkMonitorClipboard;
private System.Windows.Forms.Label lblTitle;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.GroupBox grpLibrarySettings;
private System.Windows.Forms.GroupBox grpObservableFormats;
private System.Windows.Forms.CheckBox chkObserveTexts;
private System.Windows.Forms.Label lblOptions;
private System.Windows.Forms.Label lblObservableFilesDesc;
private System.Windows.Forms.CheckBox chkObserveFiles;
private System.Windows.Forms.Label lblObservableImagesDesc;
private System.Windows.Forms.CheckBox chkObserveImages;
private System.Windows.Forms.Label lblObservableTextsDesc;
private System.Windows.Forms.TextBox txtCopiedTexts;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.PictureBox pbCopiedImage;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Panel panel4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.ListBox lstCopiedFiles;
}
}

View File

@@ -0,0 +1,126 @@
using System;
using System.IO;
using System.Drawing;
using System.Diagnostics;
using System.Windows.Forms;
using System.Security.Principal;
using System.Collections.Generic;
namespace SharpClipboard.Tests.NetCoreWinForms
{
public partial class MainForm : Form
{
#region Constructor
public MainForm()
{
InitializeComponent();
}
#endregion
#region Fields
private static WK.Libraries.SharpClipboardNS.SharpClipboard clipboard =
new WK.Libraries.SharpClipboardNS.SharpClipboard();
#endregion
#region Events
private void sharpClipboard1_MonitorClipboardChanged(object sender, EventArgs e)
{
chkMonitorClipboard.Checked = sharpClipboard1.MonitorClipboard;
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
sharpClipboard1.MonitorClipboard = chkMonitorClipboard.Checked;
}
private void chkObserveTexts_CheckedChanged(object sender, EventArgs e)
{
sharpClipboard1.ObservableFormats.Texts = chkObserveTexts.Checked;
}
private void chkObserveImages_CheckedChanged(object sender, EventArgs e)
{
sharpClipboard1.ObservableFormats.Images = chkObserveImages.Checked;
}
private void chkObserveFiles_CheckedChanged(object sender, EventArgs e)
{
sharpClipboard1.ObservableFormats.Files = chkObserveFiles.Checked;
}
private void sharpClipboard1_ClipboardChanged(object sender, WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChangedEventArgs e)
{
if (e.ContentType == WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes.Text)
{
txtCopiedTexts.Text = sharpClipboard1.ClipboardText;
// Alternatively, you can use:
// ---------------------------
// txtCopiedTexts.Text = (string)e.Content;
}
else if (e.ContentType == WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes.Image)
{
pbCopiedImage.Image = sharpClipboard1.ClipboardImage;
// Alternatively, you can use:
// ---------------------------
// pbCopiedImage.Image = (Image)e.Content;
}
else if (e.ContentType == WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes.Files)
{
// Declare variable to add the list of copied files.
List<string> files = new List<string>();
// Add all copied files to the declared variable.
foreach (string file in sharpClipboard1.ClipboardFiles)
{
files.Add(Path.GetFileName(file));
}
Debug.WriteLine(sharpClipboard1.ClipboardFiles.ToArray());
// Add all copied files to the files ListBox.
lstCopiedFiles.Items.Clear();
lstCopiedFiles.Items.AddRange(files.ToArray());
// Alternatively, you can use:
// ---------------------------
// lstCopiedFiles.Items.AddRange(((List<string>)e.Content).ToArray()));
}
else if (e.ContentType == WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes.Other)
{
// Do something with 'e.Content' or alternatively
// 'sharpClipboard1.ClipboardObject' property here...
// A great example is when a user has copied an Outlook Mail item.
// Such an item will be of a complex object-type that can be parsed and
// examined using the 'Microsoft.Office.Interop.Outlook' namespace features.
// See here: https://stackoverflow.com/questions/25375367/how-to-copy-mailitem-in-outlook-c-sharp
// You can however still use the 'ClipboardText' property if you
// prefer simply displaying the copied object in text format.
txtCopiedTexts.Text = sharpClipboard1.ClipboardText.ToString();
}
// If you wish to get details of the application from where
// any text, file, image or other objects were cut/copied,
// simply add a TextBox and uncomment the lines below.
// --------------------------------------------------------
// textBox1.Text =
// $"Name: {e.SourceApplication.Name} \n" +
// $"Title: {e.SourceApplication.Title} \n" +
// $"ID: {e.SourceApplication.ID} \n" +
// $"Handle: {e.SourceApplication.Handle} \n" +
// $"Path: {e.SourceApplication.Path}";
// --------------------------------------------------------
// This could come in-handy if you're developing a clipboard-monitoring app.
}
#endregion
}
}

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SharpClipboard.Tests.NetCoreWinForms
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\SharpClipboard\SharpClipboard.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/></startup>
</configuration>

View File

@@ -0,0 +1,470 @@
using WK.Libraries.SharpClipboardNS;
namespace SharpClipboardPreview.Tests
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.chkMonitorClipboard = new System.Windows.Forms.CheckBox();
this.lblTitle = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.lblOptions = new System.Windows.Forms.Label();
this.grpLibrarySettings = new System.Windows.Forms.GroupBox();
this.grpObservableFormats = new System.Windows.Forms.GroupBox();
this.lblObservableFilesDesc = new System.Windows.Forms.Label();
this.chkObserveFiles = new System.Windows.Forms.CheckBox();
this.lblObservableImagesDesc = new System.Windows.Forms.Label();
this.chkObserveImages = new System.Windows.Forms.CheckBox();
this.lblObservableTextsDesc = new System.Windows.Forms.Label();
this.chkObserveTexts = new System.Windows.Forms.CheckBox();
this.txtCopiedTexts = new System.Windows.Forms.TextBox();
this.panel2 = new System.Windows.Forms.Panel();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.panel3 = new System.Windows.Forms.Panel();
this.pbCopiedImage = new System.Windows.Forms.PictureBox();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.panel4 = new System.Windows.Forms.Panel();
this.lstCopiedFiles = new System.Windows.Forms.ListBox();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.sharpClipboard1 = new WK.Libraries.SharpClipboardNS.SharpClipboard(this.components);
this.panel1.SuspendLayout();
this.grpLibrarySettings.SuspendLayout();
this.grpObservableFormats.SuspendLayout();
this.panel2.SuspendLayout();
this.panel3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCopiedImage)).BeginInit();
this.panel4.SuspendLayout();
this.SuspendLayout();
//
// chkMonitorClipboard
//
this.chkMonitorClipboard.AutoSize = true;
this.chkMonitorClipboard.Checked = true;
this.chkMonitorClipboard.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkMonitorClipboard.Font = new System.Drawing.Font("Segoe UI Semibold", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.chkMonitorClipboard.ForeColor = System.Drawing.Color.Black;
this.chkMonitorClipboard.Location = new System.Drawing.Point(20, 38);
this.chkMonitorClipboard.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.chkMonitorClipboard.Name = "chkMonitorClipboard";
this.chkMonitorClipboard.Size = new System.Drawing.Size(138, 21);
this.chkMonitorClipboard.TabIndex = 1;
this.chkMonitorClipboard.Text = "Monitor Clipboard";
this.chkMonitorClipboard.UseVisualStyleBackColor = true;
this.chkMonitorClipboard.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
//
// lblTitle
//
this.lblTitle.AutoSize = true;
this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblTitle.ForeColor = System.Drawing.Color.DodgerBlue;
this.lblTitle.Location = new System.Drawing.Point(26, 16);
this.lblTitle.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.lblTitle.Name = "lblTitle";
this.lblTitle.Size = new System.Drawing.Size(155, 30);
this.lblTitle.TabIndex = 3;
this.lblTitle.Text = "SharpClipboard";
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.White;
this.panel1.Controls.Add(this.lblOptions);
this.panel1.Controls.Add(this.grpLibrarySettings);
this.panel1.Controls.Add(this.lblTitle);
this.panel1.Dock = System.Windows.Forms.DockStyle.Left;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(364, 458);
this.panel1.TabIndex = 4;
//
// lblOptions
//
this.lblOptions.AutoSize = true;
this.lblOptions.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblOptions.ForeColor = System.Drawing.Color.Black;
this.lblOptions.Location = new System.Drawing.Point(175, 16);
this.lblOptions.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.lblOptions.Name = "lblOptions";
this.lblOptions.Size = new System.Drawing.Size(86, 30);
this.lblOptions.TabIndex = 6;
this.lblOptions.Text = "Options";
//
// grpLibrarySettings
//
this.grpLibrarySettings.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpLibrarySettings.Controls.Add(this.grpObservableFormats);
this.grpLibrarySettings.Controls.Add(this.chkMonitorClipboard);
this.grpLibrarySettings.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.grpLibrarySettings.ForeColor = System.Drawing.SystemColors.ActiveCaption;
this.grpLibrarySettings.Location = new System.Drawing.Point(30, 66);
this.grpLibrarySettings.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.grpLibrarySettings.Name = "grpLibrarySettings";
this.grpLibrarySettings.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.grpLibrarySettings.Size = new System.Drawing.Size(304, 377);
this.grpLibrarySettings.TabIndex = 5;
this.grpLibrarySettings.TabStop = false;
this.grpLibrarySettings.Text = "Change library settings";
//
// grpObservableFormats
//
this.grpObservableFormats.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpObservableFormats.Controls.Add(this.lblObservableFilesDesc);
this.grpObservableFormats.Controls.Add(this.chkObserveFiles);
this.grpObservableFormats.Controls.Add(this.lblObservableImagesDesc);
this.grpObservableFormats.Controls.Add(this.chkObserveImages);
this.grpObservableFormats.Controls.Add(this.lblObservableTextsDesc);
this.grpObservableFormats.Controls.Add(this.chkObserveTexts);
this.grpObservableFormats.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.grpObservableFormats.ForeColor = System.Drawing.SystemColors.ActiveCaption;
this.grpObservableFormats.Location = new System.Drawing.Point(20, 85);
this.grpObservableFormats.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.grpObservableFormats.Name = "grpObservableFormats";
this.grpObservableFormats.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.grpObservableFormats.Size = new System.Drawing.Size(267, 275);
this.grpObservableFormats.TabIndex = 6;
this.grpObservableFormats.TabStop = false;
this.grpObservableFormats.Text = "Observable Formats";
//
// lblObservableFilesDesc
//
this.lblObservableFilesDesc.AutoSize = true;
this.lblObservableFilesDesc.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.lblObservableFilesDesc.ForeColor = System.Drawing.Color.Gray;
this.lblObservableFilesDesc.Location = new System.Drawing.Point(38, 212);
this.lblObservableFilesDesc.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.lblObservableFilesDesc.Name = "lblObservableFilesDesc";
this.lblObservableFilesDesc.Size = new System.Drawing.Size(176, 30);
this.lblObservableFilesDesc.TabIndex = 11;
this.lblObservableFilesDesc.Text = "Monitors any files/directories \r\nthat are copied to the clipboard.";
//
// chkObserveFiles
//
this.chkObserveFiles.AutoSize = true;
this.chkObserveFiles.Checked = true;
this.chkObserveFiles.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkObserveFiles.Font = new System.Drawing.Font("Segoe UI Semibold", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.chkObserveFiles.ForeColor = System.Drawing.Color.Black;
this.chkObserveFiles.Location = new System.Drawing.Point(20, 188);
this.chkObserveFiles.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.chkObserveFiles.Name = "chkObserveFiles";
this.chkObserveFiles.Size = new System.Drawing.Size(53, 21);
this.chkObserveFiles.TabIndex = 10;
this.chkObserveFiles.Text = "Files";
this.chkObserveFiles.UseVisualStyleBackColor = true;
this.chkObserveFiles.CheckedChanged += new System.EventHandler(this.chkObserveFiles_CheckedChanged);
//
// lblObservableImagesDesc
//
this.lblObservableImagesDesc.AutoSize = true;
this.lblObservableImagesDesc.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.lblObservableImagesDesc.ForeColor = System.Drawing.Color.Gray;
this.lblObservableImagesDesc.Location = new System.Drawing.Point(38, 138);
this.lblObservableImagesDesc.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.lblObservableImagesDesc.Name = "lblObservableImagesDesc";
this.lblObservableImagesDesc.Size = new System.Drawing.Size(164, 30);
this.lblObservableImagesDesc.TabIndex = 9;
this.lblObservableImagesDesc.Text = "Monitors any images that are \r\ncopied to the clipboard.";
//
// chkObserveImages
//
this.chkObserveImages.AutoSize = true;
this.chkObserveImages.Checked = true;
this.chkObserveImages.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkObserveImages.Font = new System.Drawing.Font("Segoe UI Semibold", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.chkObserveImages.ForeColor = System.Drawing.Color.Black;
this.chkObserveImages.Location = new System.Drawing.Point(20, 114);
this.chkObserveImages.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.chkObserveImages.Name = "chkObserveImages";
this.chkObserveImages.Size = new System.Drawing.Size(71, 21);
this.chkObserveImages.TabIndex = 8;
this.chkObserveImages.Text = "Images";
this.chkObserveImages.UseVisualStyleBackColor = true;
this.chkObserveImages.CheckedChanged += new System.EventHandler(this.chkObserveImages_CheckedChanged);
//
// lblObservableTextsDesc
//
this.lblObservableTextsDesc.AutoSize = true;
this.lblObservableTextsDesc.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.lblObservableTextsDesc.ForeColor = System.Drawing.Color.DimGray;
this.lblObservableTextsDesc.Location = new System.Drawing.Point(38, 62);
this.lblObservableTextsDesc.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.lblObservableTextsDesc.Name = "lblObservableTextsDesc";
this.lblObservableTextsDesc.Size = new System.Drawing.Size(151, 30);
this.lblObservableTextsDesc.TabIndex = 7;
this.lblObservableTextsDesc.Text = "Monitors any texts that are \r\ncopied to the clipboard.";
//
// chkObserveTexts
//
this.chkObserveTexts.AutoSize = true;
this.chkObserveTexts.Checked = true;
this.chkObserveTexts.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkObserveTexts.Font = new System.Drawing.Font("Segoe UI Semibold", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.chkObserveTexts.ForeColor = System.Drawing.Color.Black;
this.chkObserveTexts.Location = new System.Drawing.Point(20, 38);
this.chkObserveTexts.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.chkObserveTexts.Name = "chkObserveTexts";
this.chkObserveTexts.Size = new System.Drawing.Size(58, 21);
this.chkObserveTexts.TabIndex = 1;
this.chkObserveTexts.Text = "Texts";
this.chkObserveTexts.UseVisualStyleBackColor = true;
this.chkObserveTexts.CheckedChanged += new System.EventHandler(this.chkObserveTexts_CheckedChanged);
//
// txtCopiedTexts
//
this.txtCopiedTexts.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtCopiedTexts.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txtCopiedTexts.Location = new System.Drawing.Point(9, 80);
this.txtCopiedTexts.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.txtCopiedTexts.Multiline = true;
this.txtCopiedTexts.Name = "txtCopiedTexts";
this.txtCopiedTexts.Size = new System.Drawing.Size(275, 362);
this.txtCopiedTexts.TabIndex = 5;
//
// panel2
//
this.panel2.BackColor = System.Drawing.Color.Honeydew;
this.panel2.Controls.Add(this.label1);
this.panel2.Controls.Add(this.txtCopiedTexts);
this.panel2.Controls.Add(this.label2);
this.panel2.Dock = System.Windows.Forms.DockStyle.Left;
this.panel2.Location = new System.Drawing.Point(364, 0);
this.panel2.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(294, 458);
this.panel2.TabIndex = 6;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.label1.ForeColor = System.Drawing.Color.Black;
this.label1.Location = new System.Drawing.Point(29, 16);
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(130, 30);
this.label1.TabIndex = 7;
this.label1.Text = "Copied Texts";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.label2.Location = new System.Drawing.Point(31, 50);
this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(99, 15);
this.label2.TabIndex = 8;
this.label2.Text = "will appear here...";
//
// panel3
//
this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(234)))), ((int)(((byte)(255)))));
this.panel3.Controls.Add(this.pbCopiedImage);
this.panel3.Controls.Add(this.label3);
this.panel3.Controls.Add(this.label4);
this.panel3.Dock = System.Windows.Forms.DockStyle.Left;
this.panel3.Location = new System.Drawing.Point(658, 0);
this.panel3.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(294, 458);
this.panel3.TabIndex = 7;
//
// pbCopiedImage
//
this.pbCopiedImage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pbCopiedImage.BackColor = System.Drawing.Color.Transparent;
this.pbCopiedImage.Image = ((System.Drawing.Image)(resources.GetObject("pbCopiedImage.Image")));
this.pbCopiedImage.Location = new System.Drawing.Point(8, 80);
this.pbCopiedImage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.pbCopiedImage.Name = "pbCopiedImage";
this.pbCopiedImage.Size = new System.Drawing.Size(276, 361);
this.pbCopiedImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbCopiedImage.TabIndex = 9;
this.pbCopiedImage.TabStop = false;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.label3.ForeColor = System.Drawing.Color.Black;
this.label3.Location = new System.Drawing.Point(29, 16);
this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(163, 30);
this.label3.TabIndex = 7;
this.label3.Text = "Copied Image(s)";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.label4.Location = new System.Drawing.Point(31, 50);
this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(99, 15);
this.label4.TabIndex = 8;
this.label4.Text = "will appear here...";
//
// panel4
//
this.panel4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.panel4.BackColor = System.Drawing.Color.Ivory;
this.panel4.Controls.Add(this.lstCopiedFiles);
this.panel4.Controls.Add(this.label5);
this.panel4.Controls.Add(this.label6);
this.panel4.Location = new System.Drawing.Point(952, 0);
this.panel4.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.panel4.Name = "panel4";
this.panel4.Size = new System.Drawing.Size(294, 458);
this.panel4.TabIndex = 8;
//
// lstCopiedFiles
//
this.lstCopiedFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lstCopiedFiles.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.lstCopiedFiles.FormattingEnabled = true;
this.lstCopiedFiles.HorizontalScrollbar = true;
this.lstCopiedFiles.ItemHeight = 15;
this.lstCopiedFiles.Location = new System.Drawing.Point(9, 80);
this.lstCopiedFiles.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.lstCopiedFiles.Name = "lstCopiedFiles";
this.lstCopiedFiles.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
this.lstCopiedFiles.Size = new System.Drawing.Size(275, 362);
this.lstCopiedFiles.TabIndex = 11;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.label5.ForeColor = System.Drawing.Color.Black;
this.label5.Location = new System.Drawing.Point(29, 16);
this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(136, 30);
this.label5.TabIndex = 7;
this.label5.Text = "Copied File(s)";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.label6.Location = new System.Drawing.Point(31, 50);
this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(99, 15);
this.label6.TabIndex = 8;
this.label6.Text = "will appear here...";
//
// sharpClipboard1
//
this.sharpClipboard1.MonitorClipboard = true;
this.sharpClipboard1.ObservableFormats.All = true;
this.sharpClipboard1.ObservableFormats.Files = true;
this.sharpClipboard1.ObservableFormats.Images = true;
this.sharpClipboard1.ObservableFormats.Others = true;
this.sharpClipboard1.ObservableFormats.Texts = true;
this.sharpClipboard1.ObserveLastEntry = true;
this.sharpClipboard1.Tag = null;
this.sharpClipboard1.ClipboardChanged += new System.EventHandler<WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChangedEventArgs>(this.sharpClipboard1_ClipboardChanged);
this.sharpClipboard1.MonitorClipboardChanged += new System.EventHandler<System.EventArgs>(this.sharpClipboard1_MonitorClipboardChanged);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1246, 458);
this.Controls.Add(this.panel4);
this.Controls.Add(this.panel3);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panel1);
this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.Name = "MainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "SharpClipboard: Tests";
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.grpLibrarySettings.ResumeLayout(false);
this.grpLibrarySettings.PerformLayout();
this.grpObservableFormats.ResumeLayout(false);
this.grpObservableFormats.PerformLayout();
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
this.panel3.ResumeLayout(false);
this.panel3.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCopiedImage)).EndInit();
this.panel4.ResumeLayout(false);
this.panel4.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private SharpClipboard sharpClipboard1;
private System.Windows.Forms.CheckBox chkMonitorClipboard;
private System.Windows.Forms.Label lblTitle;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.GroupBox grpLibrarySettings;
private System.Windows.Forms.GroupBox grpObservableFormats;
private System.Windows.Forms.CheckBox chkObserveTexts;
private System.Windows.Forms.Label lblOptions;
private System.Windows.Forms.Label lblObservableFilesDesc;
private System.Windows.Forms.CheckBox chkObserveFiles;
private System.Windows.Forms.Label lblObservableImagesDesc;
private System.Windows.Forms.CheckBox chkObserveImages;
private System.Windows.Forms.Label lblObservableTextsDesc;
private System.Windows.Forms.TextBox txtCopiedTexts;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.PictureBox pbCopiedImage;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Panel panel4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.ListBox lstCopiedFiles;
}
}

View File

@@ -0,0 +1,129 @@
using System;
using System.IO;
using System.Diagnostics;
using System.Windows.Forms;
using System.Collections.Generic;
using WK.Libraries.SharpClipboardNS;
namespace SharpClipboardPreview.Tests
{
/// <summary>
/// The main application window.
/// </summary>
public partial class MainForm : Form
{
#region Constructor
public MainForm()
{
InitializeComponent();
// Assign the various checkboxes to enable/disable
// the supported clipboard formats respectively.
chkMonitorClipboard.Checked = sharpClipboard1.MonitorClipboard;
chkObserveTexts.Checked = sharpClipboard1.ObservableFormats.Texts;
chkObserveFiles.Checked = sharpClipboard1.ObservableFormats.Files;
chkObserveImages.Checked = sharpClipboard1.ObservableFormats.Images;
}
#endregion
#region Events
private void sharpClipboard1_MonitorClipboardChanged(object sender, EventArgs e)
{
chkMonitorClipboard.Checked = sharpClipboard1.MonitorClipboard;
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
sharpClipboard1.MonitorClipboard = chkMonitorClipboard.Checked;
}
private void chkObserveTexts_CheckedChanged(object sender, EventArgs e)
{
sharpClipboard1.ObservableFormats.Texts = chkObserveTexts.Checked;
}
private void chkObserveImages_CheckedChanged(object sender, EventArgs e)
{
sharpClipboard1.ObservableFormats.Images = chkObserveImages.Checked;
}
private void chkObserveFiles_CheckedChanged(object sender, EventArgs e)
{
sharpClipboard1.ObservableFormats.Files = chkObserveFiles.Checked;
}
private void sharpClipboard1_ClipboardChanged(object sender, SharpClipboard.ClipboardChangedEventArgs e)
{
if (e.ContentType == SharpClipboard.ContentTypes.Text)
{
txtCopiedTexts.Text = sharpClipboard1.ClipboardText;
// Alternatively, you can use:
// ---------------------------
// txtCopiedTexts.Text = (string)e.Content;
}
else if (e.ContentType == SharpClipboard.ContentTypes.Image)
{
pbCopiedImage.Image = sharpClipboard1.ClipboardImage;
// Alternatively, you can use:
// ---------------------------
// pbCopiedImage.Image = (Image)e.Content;
}
else if (e.ContentType == SharpClipboard.ContentTypes.Files)
{
// Declare variable to add the list of copied files.
List<string> files = new List<string>();
// Add all copied files to the declared variable.
foreach (string file in sharpClipboard1.ClipboardFiles)
{
files.Add(Path.GetFileName(file));
}
Debug.WriteLine(sharpClipboard1.ClipboardFiles.ToArray());
// Add all copied files to the files ListBox.
lstCopiedFiles.Items.Clear();
lstCopiedFiles.Items.AddRange(files.ToArray());
// Alternatively, you can use:
// ---------------------------
// lstCopiedFiles.Items.AddRange(((List<string>)e.Content).ToArray()));
}
else if (e.ContentType == SharpClipboard.ContentTypes.Other)
{
// Do something with 'e.Content' or alternatively
// 'sharpClipboard1.ClipboardObject' property here...
// A great example is when a user has copied an Outlook Mail item.
// Such an item will be of a complex object-type that can be parsed and
// examined using the 'Microsoft.Office.Interop.Outlook' namespace features.
// See here: https://stackoverflow.com/questions/25375367/how-to-copy-mailitem-in-outlook-c-sharp
// You can however still use the 'ClipboardText' property if you
// prefer simply displaying the copied object in text format.
txtCopiedTexts.Text = sharpClipboard1.ClipboardText.ToString();
}
// If you wish to get details of the application from where
// any text, file, image or other objects were cut/copied,
// simply add a TextBox and uncomment the lines below.
// --------------------------------------------------------
// textBox1.Text =
// $"Name: {e.SourceApplication.Name} \n" +
// $"Title: {e.SourceApplication.Title} \n" +
// $"ID: {e.SourceApplication.ID} \n" +
// $"Handle: {e.SourceApplication.Handle} \n" +
// $"Path: {e.SourceApplication.Path}";
// --------------------------------------------------------
// This could come in-handy if you're developing a clipboard-monitoring app.
}
#endregion
}
}

View File

@@ -0,0 +1,306 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing.Common" name="System.Drawing.Common, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
<data name="pbCopiedImage.Image" type="System.Drawing.Bitmap, System.Drawing.Common" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
9vdqgABAYp4I892Hp6endx04cOBr77zzTjk/onyyCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAA
IG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggA
ANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosA
ACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbII
AADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaL
AAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2y
CAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANIm
iwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBt
sggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADS
JosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAg
bbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA
0iaLAAAgbbIIAADSJosAACBtsggAANImiwAAIG2yCAAA0iaLAAAgbbIIAADSJosAACBtsggAANImiwAA
IG2yCAAA0iaLAAAgZV8Z+H8/k+/WS0mpwAAAAABJRU5ErkJggg==
</value>
</data>
<metadata name="$this.TrayHeight" type="System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e">
<value>65</value>
</metadata>
</root>

View File

@@ -0,0 +1,19 @@
using System;
using System.Windows.Forms;
namespace SharpClipboardPreview.Tests
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("SharpClipboard Tests")]
[assembly: AssemblyDescription("A testing project for the SharpClipboard library.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Willy Kimura")]
[assembly: AssemblyProduct("SharpCliboard - Testing Project")]
[assembly: AssemblyCopyright("Copyright © 2019, Willy Kimura.")]
[assembly: AssemblyTrademark("A product of Willy Kimura.")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("86f8eac7-259d-4a2f-842d-aa93163293c0")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace SharpClipboardPreview.Tests.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SharpClipboardPreview.Tests.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace SharpClipboardPreview.Tests.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.5.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@@ -0,0 +1,45 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFrameworks>netcoreapp3.0;net20</TargetFrameworks>
<UseWindowsForms>true</UseWindowsForms>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<RootNamespace>SharpClipboardPreview.Tests</RootNamespace>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net20' ">
<Reference Include="System.Design" />
<Reference Include="System.Drawing.Design" />
<Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SharpClipboard\SharpClipboard.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="Properties\Settings.Designer.cs">
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Update="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,37 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30002.166
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpClipboard", "SharpClipboard\SharpClipboard.csproj", "{005C3326-D638-4113-AEBB-A83433CC015E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpClipboard.Tests.WinForms", "SharpClipboard.Tests.WinForms\SharpClipboard.Tests.WinForms.csproj", "{86F8EAC7-259D-4A2F-842D-AA93163293C0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpClipboard.Tests.NetCoreWinForms", "SharpClipboard.Tests.NetCoreWinForms\SharpClipboard.Tests.NetCoreWinForms.csproj", "{D73E5EB1-DC2F-46E2-A30D-D76ECF2C4A07}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{005C3326-D638-4113-AEBB-A83433CC015E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{005C3326-D638-4113-AEBB-A83433CC015E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{005C3326-D638-4113-AEBB-A83433CC015E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{005C3326-D638-4113-AEBB-A83433CC015E}.Release|Any CPU.Build.0 = Release|Any CPU
{86F8EAC7-259D-4A2F-842D-AA93163293C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{86F8EAC7-259D-4A2F-842D-AA93163293C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{86F8EAC7-259D-4A2F-842D-AA93163293C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{86F8EAC7-259D-4A2F-842D-AA93163293C0}.Release|Any CPU.Build.0 = Release|Any CPU
{D73E5EB1-DC2F-46E2-A30D-D76ECF2C4A07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D73E5EB1-DC2F-46E2-A30D-D76ECF2C4A07}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D73E5EB1-DC2F-46E2-A30D-D76ECF2C4A07}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D73E5EB1-DC2F-46E2-A30D-D76ECF2C4A07}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8D4EE96B-783A-40A6-ACB6-75B1ABB152B6}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("SharpClipboard - A library for anonymously monitoring clipboard entries.")]
[assembly: AssemblyDescription("SharpClipboard is a clipboard-monitoring library for .NET that listens to the system's clipboard entries, allowing developers to tap into the rich capabilities of determining the clipboard's contents at runtime.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Willy Kimura")]
[assembly: AssemblyProduct("SharpClipboard - Clipboard Monitoring Library")]
[assembly: AssemblyCopyright("Copyright © 2020, Willy Kimura.")]
[assembly: AssemblyTrademark("A product of Willy Kimura.")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("005c3326-d638-4113-aebb-a83433cc015e")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.5.2.0")]
[assembly: AssemblyFileVersion("3.5.2.0")]

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace WK.Libraries.SharpClipboardNS.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WK.Libraries.SharpClipboardNS.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,36 @@
namespace WK.Libraries.SharpClipboardNS
{
partial class SharpClipboard
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@@ -0,0 +1,729 @@
#region Copyright
/*
* Developer : Willy Kimura (WK).
* Library : SharpCliboard.
* License : MIT.
*
* This handy library was designed to assist .NET developers
* monitor the system cliboard in an easier and pluggable
* fashion that before. It provides support for detecting
* data formats including texts, images & files. To use it
* at design-time, simply add the component in the Toolbox
* then drag-n-drop it inside your Form to customize its
* options and features. Improvements are always welcome.
*
*/
#endregion
using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.Runtime.InteropServices;
using WK.Libraries.SharpClipboardNS.Views;
namespace WK.Libraries.SharpClipboardNS
{
/// <summary>
/// Assists in anonymously monitoring the system clipboard by
/// detecting any copied/cut data and the type of data it is.
/// </summary>
[Designer(typeof(WKDesigner))]
[DefaultEvent("ClipboardChanged")]
[DefaultProperty("MonitorClipboard")]
[Description("Assists in anonymously monitoring the system clipboard by " +
"detecting any copied/cut data and the type of data it is.")]
public partial class SharpClipboard : Component
{
#region Constructors
/// <summary>
/// Initializes a new instance of <see cref="SharpClipboard"/>.
/// </summary>
public SharpClipboard()
{
InitializeComponent();
SetDefaults();
}
/// <summary>
/// Initializes a new instance of <see cref="SharpClipboard"/>.
/// </summary>
/// <param name="container">
/// The container hosting the component.
/// </param>
public SharpClipboard(IContainer container)
{
container.Add(this);
InitializeComponent();
SetDefaults();
}
#endregion
#region Fields
private bool _monitorClipboard;
private bool _observeLastEntry;
private Timer _timer = new Timer();
private ClipboardHandle _handle = new ClipboardHandle();
private ObservableDataFormats _observableFormats = new ObservableDataFormats();
#endregion
#region Enumerations
/// <summary>
/// Provides a list of the supported clipboard content types.
/// </summary>
public enum ContentTypes
{
/// <summary>
/// Represents <see cref="String"/> content.
/// </summary>
Text = 0,
/// <summary>
/// Represents <see cref="Image"/> content.
/// </summary>
Image = 1,
/// <summary>
/// Represents content as a <see cref="List{string}"/> of files.
/// </summary>
Files = 2,
/// <summary>
/// Represents any complex objects.
/// </summary>
Other = 3
}
#endregion
#region Properties
#region Browsable
/// <summary>
/// Gets or sets a value indicating whether the clipboard
/// will be monitored once the application launches.
/// </summary>
[Category("#Clipboard: Behaviour")]
[Description("Sets a value indicating whether the clipboard " +
"will be monitored once the application launches.")]
public bool MonitorClipboard
{
get { return _monitorClipboard; }
set {
_monitorClipboard = value;
MonitorClipboardChanged?.Invoke(this, EventArgs.Empty);
}
}
/// <summary>
/// When set to true, the last cut/copied clipboard item will
/// not be auto-picked once monitoring is enabled. However when
/// set to false, the last cut/copied clipboard item will be
/// auto-picked once monitoring is enabled.
/// </summary>
[Category("#Clipboard: Behaviour")]
[Description("When set to true, the last cut/copied clipboard item will " +
"be auto-picked once monitoring is enabled. However when " +
"set to false, the last cut/copied clipboard item will not " +
"be auto-picked once monitoring is enabled.")]
public bool ObserveLastEntry
{
get { return _observeLastEntry; }
set {
_observeLastEntry = value;
ObserveLastEntryChanged?.Invoke(this, EventArgs.Empty);
}
}
/// <summary>
/// Gets or sets the data formats that will be observed
/// or monitored when cut/copy actions are triggered.
/// </summary>
[Category("#Clipboard: Behaviour")]
[Description("Sets the data formats that will be observed " +
"or monitored when cut/copy actions are triggered.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ObservableDataFormats ObservableFormats
{
get { return _observableFormats; }
set {
_observableFormats = value;
ObservableFormatsChanged?.Invoke(this, EventArgs.Empty);
}
}
/// <summary>
/// Gets or sets the object that contains programmer-
/// supplied data associated with the component.
/// </summary>
[Bindable(true)]
[Category("#Clipboard: Miscellaneous")]
[TypeConverter(typeof(StringConverter))]
[Description("Sets the object that contains programmer-" +
"supplied data associated with the component.")]
public virtual object Tag { get; set; }
#endregion
#region Non-browsable
/// <summary>
/// Gets the currently cut/copied clipboard text.
/// </summary>
[Browsable(false)]
public string ClipboardText { get; internal set; }
/// <summary>
/// Gets the currently cut/copied clipboard <see cref="object"/>.
/// This is necessary when handling complex content copied to the clipboard.
/// </summary>
[Browsable(false)]
public object ClipboardObject { get; internal set; }
/// <summary>
/// Gets the currently cut/copied clipboard file-path.
/// </summary>
[Browsable(false)]
public string ClipboardFile { get; internal set; }
/// <summary>
/// Gets the currently cut/copied clipboard file-paths.
/// </summary>
[Browsable(false)]
public List<string> ClipboardFiles { get; internal set; } = new List<string>();
/// <summary>
/// Gets the currently cut/copied clipboard image.
/// </summary>
[Browsable(false)]
public Image ClipboardImage { get; internal set; }
/// <summary>
/// Lets you change the invisible clipboard-window-handle's title
/// that is designed to receive broadcasted clipboard messages. This is
/// however unnecessary for normal users but may be essential if you're
/// working under special circumstances that require supervision.
/// The window will however remain hidden from all users.
/// </summary>
[Browsable(false)]
public static string HandleCaption { get; set; } = string.Empty;
#endregion
#endregion
#region Methods
#region Public
/// <summary>
/// Gets the current foreground window's handle.
/// </summary>
/// <returns></returns>
public IntPtr ForegroundWindowHandle()
{
return GetForegroundWindow();
}
/// <summary>
/// Starts the clipboard-monitoring process and
/// initializes the system clipboard-access handle.
/// </summary>
public void StartMonitoring()
{
_handle.Show();
}
/// <summary>
/// Ends the clipboard-monitoring process and
/// shuts the system clipboard-access handle.
/// </summary>
public void StopMonitoring()
{
_handle.Close();
}
#endregion
#region Private
/// <summary>
/// Apply library-default settings and launch code.
/// </summary>
private void SetDefaults()
{
_handle.SharpClipboardInstance = this;
_timer.Enabled = true;
_timer.Interval = 1000;
_timer.Tick += OnLoad;
MonitorClipboard = true;
ObserveLastEntry = true;
}
/// <summary>
/// Invokes the <see cref="ClipboardChanged"/> event with formal parameters.
/// </summary>
/// <param name="content">The current clipboard content.</param>
/// <param name="type">The current clipboard content-type.</param>
internal void Invoke(object content, ContentTypes type, SourceApplication source)
{
ClipboardChanged?.Invoke(this, new ClipboardChangedEventArgs(content, type, source));
}
/// <summary>
/// Gets the foreground or currently active window handle.
/// </summary>
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
#endregion
#endregion
#region Events
#region Public
#region Event Handlers
/// <summary>
/// This event is triggered whenever the
/// system clipboard has been modified.
/// </summary>
[Category("#Clipboard: Events")]
[Description("This event is triggered whenever the " +
"system clipboard has been modified.")]
public event EventHandler<ClipboardChangedEventArgs> ClipboardChanged = null;
/// <summary>
/// Occurs whenever the clipboard-monitoring status has been changed.
/// </summary>
[Category("#Clipboard: Events")]
[Description("Occurs whenever the clipboard-monitoring status has been changed.")]
public event EventHandler<EventArgs> MonitorClipboardChanged = null;
/// <summary>
/// Occurs whenever the allowed observable formats have been changed.
/// </summary>
[Category("#Clipboard: Events")]
[Description("Occurs whenever the allowed observable formats have been changed.")]
public event EventHandler<EventArgs> ObservableFormatsChanged = null;
/// <summary>
/// Occurs whenever the 'ObserveLastEntry' property has been changed.
/// </summary>
[Category("#Clipboard: Events")]
[Description("Occurs whenever the allowed observable formats have been changed.")]
public event EventHandler<EventArgs> ObserveLastEntryChanged = null;
#endregion
#region Event Arguments
/// <summary>
/// Provides data for the <see cref="ClipboardChanged"/> event.
/// </summary>
public class ClipboardChangedEventArgs : EventArgs
{
#region Constructor
/// <summary>
/// Provides data for the <see cref="ClipboardChanged"/> event.
/// </summary>
/// <param name="content">The current clipboard content.</param>
/// <param name="contentType">The current clipboard-content-type.</param>
public ClipboardChangedEventArgs(object content, ContentTypes contentType, SourceApplication source)
{
Content = content;
ContentType = contentType;
_source = new SourceApplication(source.ID, source.Handle, source.Name,
source.Title, source.Path);
}
#endregion
#region Fields
private SourceApplication _source;
#endregion
#region Properties
/// <summary>
/// Gets the currently copied clipboard content.
/// </summary>
public object Content { get; }
/// <summary>
/// Gets the currently copied clipboard content-type.
/// </summary>
public ContentTypes ContentType { get; }
/// <summary>
/// Gets the application from where the
/// clipboard's content were copied.
/// </summary>
public SourceApplication SourceApplication
{
get { return _source; }
}
#endregion
}
#endregion
#endregion
#region Private
/// <summary>
/// This initiates a Timer that then begins the
/// clipboard-monitoring service. The Timer will
/// auto-shutdown once the service has started.
/// </summary>
private void OnLoad(object sender, EventArgs e)
{
if (!DesignMode)
{
_timer.Stop();
_timer.Enabled = false;
StartMonitoring();
}
}
#endregion
#endregion
#region Smart Tags
#region Standard: Designer
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
public class WKDesigner : ComponentDesigner
{
private DesignerActionListCollection actionLists;
// Use pull model to populate smart tag menu.
public override DesignerActionListCollection ActionLists
{
get {
if (null == actionLists)
{
actionLists = new DesignerActionListCollection
{
new WKComponentActionList(this.Component)
};
}
return actionLists;
}
}
}
#endregion
#region Modifiers: Properties
/// <summary>
/// Initializes a new instance of the <see cref="WKComponentActionList"/> class.
/// </summary>
public class WKComponentActionList : DesignerActionList
{
private SharpClipboard WKComponent;
private DesignerActionUIService designerActionUISvc = null;
public WKComponentActionList(IComponent component) : base(component)
{
this.WKComponent = component as SharpClipboard;
// Cache a reference to DesignerActionUIService so
// that the DesignerActionList can be refreshed.
this.designerActionUISvc = GetService(typeof(DesignerActionUIService))
as DesignerActionUIService;
// Automatically display Smart Tags for quick access
// to the most common properties needed by users.
this.AutoShow = true;
}
#region Properties Manager
internal static PropertyDescriptor GetPropertyDescriptor(IComponent component, string propertyName)
{
return TypeDescriptor.GetProperties(component)[propertyName];
}
internal static IDesignerHost GetDesignerHost(IComponent component)
{
return (IDesignerHost)component.Site.GetService(typeof(IDesignerHost));
}
internal static IComponentChangeService GetChangeService(IComponent component)
{
return (IComponentChangeService)component.Site.GetService(typeof(IComponentChangeService));
}
internal static void SetValue(IComponent component, string propertyName, object value)
{
PropertyDescriptor propertyDescriptor = GetPropertyDescriptor(component, propertyName);
IComponentChangeService svc = GetChangeService(component);
IDesignerHost host = GetDesignerHost(component);
DesignerTransaction txn = host.CreateTransaction();
try
{
svc.OnComponentChanging(component, propertyDescriptor);
propertyDescriptor.SetValue(component, value);
svc.OnComponentChanged(component, propertyDescriptor, null, null);
txn.Commit();
txn = null;
}
finally
{
if (txn != null)
txn.Cancel();
}
}
#endregion
#region Items Manager
/// <summary>
/// Implementation of this abstract method creates Smart Tag items,
/// associates their targets, and collects them into a list.
/// </summary>
public override DesignerActionItemCollection GetSortedActionItems()
{
DesignerActionItemCollection items = new DesignerActionItemCollection
{
// Define static section header entries.
new DesignerActionHeaderItem("Behaviour"),
// Add Designer items.
new DesignerActionPropertyItem("MonitorClipboard",
"Monitor Clipboard", "Behaviour",
GetPropertyDescriptor(this.Component, "MonitorClipboard").Description)
};
return items;
}
#region Properties
public bool MonitorClipboard
{
get { return WKComponent.MonitorClipboard; }
set { SetValue(WKComponent, "MonitorClipboard", value); }
}
#endregion
#endregion
}
#endregion
#endregion
}
#region Property Classes
/// <summary>
/// Provides a list of supported observable data formats
/// that can be monitored from the system clipboard.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
[TypeConverter(typeof(ExpandableObjectConverter))]
[Description("Provides a list of supported observable data formats " +
"that can be monitored from the system clipboard.")]
public class ObservableDataFormats
{
/// <summary>
/// Creates a new <see cref="ObservableDataFormats"/> options class-instance.
/// </summary>
public ObservableDataFormats()
{
_all = true;
}
#region Fields
private bool _all;
#endregion
#region Properties
/// <summary>
/// Gets or sets a value indicating whether all the
/// supported observable formats will be monitored.
/// </summary>
[ParenthesizePropertyName(true)]
[Category("#Clipboard: Behaviour")]
[Description("Sets a value indicating whether all the supported " +
"observable formats will be monitored.")]
public bool All
{
get { return _all; }
set {
_all = value;
Texts = value;
Files = value;
Images = value;
Others = value;
}
}
/// <summary>
/// Gets or sets a value indicating whether texts will be monitored.
/// </summary>
[Category("#Clipboard: Behaviour")]
[Description("Sets a value indicating whether texts will be monitored.")]
public bool Texts { get; set; } = true;
/// <summary>
/// Gets or sets a value indicating whether files will be monitored.
/// </summary>
[Category("#Clipboard: Behaviour")]
[Description("Sets a value indicating whether files will be monitored.")]
public bool Files { get; set; } = true;
/// <summary>
/// Gets or sets a value indicating whether images will be monitored.
/// </summary>
[Category("#Clipboard: Behaviour")]
[Description("Sets a value indicating whether images will be monitored.")]
public bool Images { get; set; } = true;
/// <summary>
/// Gets or sets a value indicating whether other
/// complex object-types will be monitored.
/// </summary>
[Category("#Clipboard: Behaviour")]
[Description("Sets a value indicating whether other " +
"complex object-types will be monitored.")]
public bool Others { get; set; } = true;
#endregion
#region Overrides
/// <summary>
/// Returns a <see cref="string"/> containing the list of observable data
/// formats provided and their applied statuses separated by semi-colons.
/// </summary>
public override string ToString()
{
return $"Texts: {Texts}; Images: {Images}; Files: {Files}; Others: {Others}";
}
#endregion
}
/// <summary>
/// Stores details of the application from
/// where the clipboard's content were copied.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public class SourceApplication
{
/// <summary>
/// Creates a new <see cref="SourceApplication"/> class-instance.
/// </summary>
/// <param name="id">The application's ID.</param>
/// <param name="handle">The application's handle.</param>
/// <param name="name">The application's name.</param>
/// <param name="title">The application's title.</param>
/// <param name="path">The application's path.</param>
internal SourceApplication(int id, IntPtr handle, string name,
string title, string path)
{
ID = id;
Name = name;
Path = path;
Title = title;
Handle = handle;
}
#region Properties
/// <summary>
/// Gets the application's process-ID.
/// </summary>
public int ID { get; }
/// <summary>
/// Gets the appliation's window-handle.
/// </summary>
public IntPtr Handle { get; }
/// <summary>
/// Gets the application's name.
/// </summary>
public string Name { get; }
/// <summary>
/// Gets the application's title-text.
/// </summary>
public string Title { get; }
/// <summary>
/// Gets the application's absolute path.
/// </summary>
public string Path { get; }
#endregion
#region Overrides
/// <summary>
/// Returns a <see cref="string"/> containing the list
/// of application details provided.
/// </summary>
public override string ToString()
{
return $"ID: {ID}; Handle: {Handle}, Name: {Name}; " +
$"Title: {Title}; Path: {Path}";
}
#endregion
}
#endregion
}

View File

@@ -0,0 +1,58 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<RootNamespace>WK.Libraries.SharpClipboardNS</RootNamespace>
<TargetFrameworks>netcoreapp3.0;net20</TargetFrameworks>
<UseWindowsForms>true</UseWindowsForms>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>3.5.0</Version>
<Authors>WillyKimura</Authors>
<Company />
<Product />
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/Willy-Kimura/SharpClipboard</PackageProjectUrl>
<PackageIconUrl></PackageIconUrl>
<Description>SharpClipboard is a clipboard-monitoring library for .NET that listens to the system's clipboard entries, allowing developers to tap into the rich capabilities of determining the clipboard's contents at runtime.</Description>
<PackageReleaseNotes>- The 'ClipboardFiles' property will now be cleared upon copying files.
- Prevented crashing when performing a clipboard operation in Remote Desktop environments.</PackageReleaseNotes>
<Copyright>© 2020 Willy Kimura</Copyright>
<PackageTags>c# vb clipboard monitor clipboard-monitor clipboard-manager clipboard-history</PackageTags>
<PackageIcon>clipboard.png</PackageIcon>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/Willy-Kimura/SharpClipboard.git</RepositoryUrl>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
<DocumentationFile>SharpClipboard.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<DocumentationFile>SharpClipboard.xml</DocumentationFile>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net20' ">
<Reference Include="System.Design" />
<Reference Include="System.Drawing.Design" />
<Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<None Include="..\Assets\clipboard.png" Pack="true" PackagePath="" Link="Assets\clipboard.png" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Folder Include="Assets\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,396 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>SharpClipboard</name>
</assembly>
<members>
<member name="T:WK.Libraries.SharpClipboardNS.Properties.Resources">
<summary>
A strongly-typed resource class, for looking up localized strings, etc.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.Properties.Resources.ResourceManager">
<summary>
Returns the cached ResourceManager instance used by this class.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.Properties.Resources.Culture">
<summary>
Overrides the current thread's CurrentUICulture property for all
resource lookups using this strongly typed resource class.
</summary>
</member>
<member name="T:WK.Libraries.SharpClipboardNS.SharpClipboard">
<summary>
Assists in anonymously monitoring the system clipboard by
detecting any copied/cut data and the type of data it is.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.#ctor">
<summary>
Initializes a new instance of <see cref="T:WK.Libraries.SharpClipboardNS.SharpClipboard"/>.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.#ctor(System.ComponentModel.IContainer)">
<summary>
Initializes a new instance of <see cref="T:WK.Libraries.SharpClipboardNS.SharpClipboard"/>.
</summary>
<param name="container">
The container hosting the component.
</param>
</member>
<member name="T:WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes">
<summary>
Provides a list of the supported clipboard content types.
</summary>
</member>
<member name="F:WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes.Text">
<summary>
Represents <see cref="T:System.String"/> content.
</summary>
</member>
<member name="F:WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes.Image">
<summary>
Represents <see cref="F:WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes.Image"/> content.
</summary>
</member>
<member name="F:WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes.Files">
<summary>
Represents content as a <see cref="!:List&lt;string&gt;"/> of files.
</summary>
</member>
<member name="F:WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes.Other">
<summary>
Represents any complex objects.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.MonitorClipboard">
<summary>
Gets or sets a value indicating whether the clipboard
will be monitored once the application launches.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.ObserveLastEntry">
<summary>
When set to true, the last cut/copied clipboard item will
not be auto-picked once monitoring is enabled. However when
set to false, the last cut/copied clipboard item will be
auto-picked once monitoring is enabled.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.ObservableFormats">
<summary>
Gets or sets the data formats that will be observed
or monitored when cut/copy actions are triggered.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.Tag">
<summary>
Gets or sets the object that contains programmer-
supplied data associated with the component.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardText">
<summary>
Gets the currently cut/copied clipboard text.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardObject">
<summary>
Gets the currently cut/copied clipboard <see cref="T:System.Object"/>.
This is necessary when handling complex content copied to the clipboard.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardFile">
<summary>
Gets the currently cut/copied clipboard file-path.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardFiles">
<summary>
Gets the currently cut/copied clipboard file-paths.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardImage">
<summary>
Gets the currently cut/copied clipboard image.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.HandleCaption">
<summary>
Lets you change the invisible clipboard-window-handle's title
that is designed to receive broadcasted clipboard messages. This is
however unnecessary for normal users but may be essential if you're
working under special circumstances that require supervision.
The window will however remain hidden from all users.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.ForegroundWindowHandle">
<summary>
Gets the current foreground window's handle.
</summary>
<returns></returns>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.StartMonitoring">
<summary>
Starts the clipboard-monitoring process and
initializes the system clipboard-access handle.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.StopMonitoring">
<summary>
Ends the clipboard-monitoring process and
shuts the system clipboard-access handle.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.SetDefaults">
<summary>
Apply library-default settings and launch code.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.Invoke(System.Object,WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes,WK.Libraries.SharpClipboardNS.SourceApplication)">
<summary>
Invokes the <see cref="E:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChanged"/> event with formal parameters.
</summary>
<param name="content">The current clipboard content.</param>
<param name="type">The current clipboard content-type.</param>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.GetForegroundWindow">
<summary>
Gets the foreground or currently active window handle.
</summary>
</member>
<member name="E:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChanged">
<summary>
This event is triggered whenever the
system clipboard has been modified.
</summary>
</member>
<member name="E:WK.Libraries.SharpClipboardNS.SharpClipboard.MonitorClipboardChanged">
<summary>
Occurs whenever the clipboard-monitoring status has been changed.
</summary>
</member>
<member name="E:WK.Libraries.SharpClipboardNS.SharpClipboard.ObservableFormatsChanged">
<summary>
Occurs whenever the allowed observable formats have been changed.
</summary>
</member>
<member name="E:WK.Libraries.SharpClipboardNS.SharpClipboard.ObserveLastEntryChanged">
<summary>
Occurs whenever the 'ObserveLastEntry' property has been changed.
</summary>
</member>
<member name="T:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChangedEventArgs">
<summary>
Provides data for the <see cref="E:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChanged"/> event.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChangedEventArgs.#ctor(System.Object,WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes,WK.Libraries.SharpClipboardNS.SourceApplication)">
<summary>
Provides data for the <see cref="E:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChanged"/> event.
</summary>
<param name="content">The current clipboard content.</param>
<param name="contentType">The current clipboard-content-type.</param>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChangedEventArgs.Content">
<summary>
Gets the currently copied clipboard content.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChangedEventArgs.ContentType">
<summary>
Gets the currently copied clipboard content-type.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SharpClipboard.ClipboardChangedEventArgs.SourceApplication">
<summary>
Gets the application from where the
clipboard's content were copied.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.OnLoad(System.Object,System.EventArgs)">
<summary>
This initiates a Timer that then begins the
clipboard-monitoring service. The Timer will
auto-shutdown once the service has started.
</summary>
</member>
<member name="T:WK.Libraries.SharpClipboardNS.SharpClipboard.WKComponentActionList">
<summary>
Initializes a new instance of the <see cref="T:WK.Libraries.SharpClipboardNS.SharpClipboard.WKComponentActionList"/> class.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.WKComponentActionList.GetSortedActionItems">
<summary>
Implementation of this abstract method creates Smart Tag items,
associates their targets, and collects them into a list.
</summary>
</member>
<member name="F:WK.Libraries.SharpClipboardNS.SharpClipboard.components">
<summary>
Required designer variable.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.Dispose(System.Boolean)">
<summary>
Clean up any resources being used.
</summary>
<param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SharpClipboard.InitializeComponent">
<summary>
Required method for Designer support - do not modify
the contents of this method with the code editor.
</summary>
</member>
<member name="T:WK.Libraries.SharpClipboardNS.ObservableDataFormats">
<summary>
Provides a list of supported observable data formats
that can be monitored from the system clipboard.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.ObservableDataFormats.#ctor">
<summary>
Creates a new <see cref="T:WK.Libraries.SharpClipboardNS.ObservableDataFormats"/> options class-instance.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.ObservableDataFormats.All">
<summary>
Gets or sets a value indicating whether all the
supported observable formats will be monitored.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.ObservableDataFormats.Texts">
<summary>
Gets or sets a value indicating whether texts will be monitored.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.ObservableDataFormats.Files">
<summary>
Gets or sets a value indicating whether files will be monitored.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.ObservableDataFormats.Images">
<summary>
Gets or sets a value indicating whether images will be monitored.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.ObservableDataFormats.Others">
<summary>
Gets or sets a value indicating whether other
complex object-types will be monitored.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.ObservableDataFormats.ToString">
<summary>
Returns a <see cref="T:System.String"/> containing the list of observable data
formats provided and their applied statuses separated by semi-colons.
</summary>
</member>
<member name="T:WK.Libraries.SharpClipboardNS.SourceApplication">
<summary>
Stores details of the application from
where the clipboard's content were copied.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SourceApplication.#ctor(System.Int32,System.IntPtr,System.String,System.String,System.String)">
<summary>
Creates a new <see cref="T:WK.Libraries.SharpClipboardNS.SourceApplication"/> class-instance.
</summary>
<param name="id">The application's ID.</param>
<param name="handle">The application's handle.</param>
<param name="name">The application's name.</param>
<param name="title">The application's title.</param>
<param name="path">The application's path.</param>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SourceApplication.ID">
<summary>
Gets the application's process-ID.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SourceApplication.Handle">
<summary>
Gets the appliation's window-handle.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SourceApplication.Name">
<summary>
Gets the application's name.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SourceApplication.Title">
<summary>
Gets the application's title-text.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.SourceApplication.Path">
<summary>
Gets the application's absolute path.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.SourceApplication.ToString">
<summary>
Returns a <see cref="T:System.String"/> containing the list
of application details provided.
</summary>
</member>
<member name="T:WK.Libraries.SharpClipboardNS.Views.ClipboardHandle">
<summary>
This window acts as a handle to the clipboard-monitoring process and
thus will be launched in the background once the component has started
the monitoring service. However, it won't be visible to anyone even via
the Task Manager.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.Views.ClipboardHandle.#ctor">
<summary>
Initializes a new instance of <see cref="T:WK.Libraries.SharpClipboardNS.Views.ClipboardHandle"/>.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.Views.ClipboardHandle.Ready">
<summary>
Checks if the handle is ready to monitor the system clipboard.
It is used to provide a final value for use whenever the property
'ObserveLastEntry' is enabled.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.Views.ClipboardHandle.SharpClipboardInstance">
<summary>
Gets or sets an active <see cref="T:WK.Libraries.SharpClipboardNS.SharpClipboard"/> instance
for use when managing the current clipboard handle.
</summary>
</member>
<member name="P:WK.Libraries.SharpClipboardNS.Views.ClipboardHandle.CreateParams">
<summary>
Modifications in this overriden method have
been added to disable viewing of the handle-
window in the Task Manager.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.Views.ClipboardHandle.WndProc(System.Windows.Forms.Message@)">
<summary>
This is the main clipboard detection method.
Algorithmic customizations are most welcome.
</summary>
<param name="m">The processed window-reference message.</param>
</member>
<member name="F:WK.Libraries.SharpClipboardNS.Views.ClipboardHandle.components">
<summary>
Required designer variable.
</summary>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.Views.ClipboardHandle.Dispose(System.Boolean)">
<summary>
Clean up any resources being used.
</summary>
<param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
</member>
<member name="M:WK.Libraries.SharpClipboardNS.Views.ClipboardHandle.InitializeComponent">
<summary>
Required method for Designer support - do not modify
the contents of this method with the code editor.
</summary>
</member>
</members>
</doc>

View File

@@ -0,0 +1,97 @@
namespace WK.Libraries.SharpClipboardNS.Views
{
partial class ClipboardHandle
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ClipboardHandle));
this.panel1 = new System.Windows.Forms.Panel();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.lblInformation = new System.Windows.Forms.Label();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.pictureBox1);
this.panel1.Controls.Add(this.lblInformation);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(408, 125);
this.panel1.TabIndex = 2;
//
// pictureBox1
//
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(178, 14);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(53, 50);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pictureBox1.TabIndex = 3;
this.pictureBox1.TabStop = false;
//
// lblInformation
//
this.lblInformation.AutoSize = true;
this.lblInformation.ForeColor = System.Drawing.Color.DimGray;
this.lblInformation.Location = new System.Drawing.Point(24, 72);
this.lblInformation.Name = "lblInformation";
this.lblInformation.Size = new System.Drawing.Size(360, 39);
this.lblInformation.TabIndex = 2;
this.lblInformation.Text = resources.GetString("lblInformation.Text");
//
// ClipboardHandle
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(408, 125);
this.Controls.Add(this.panel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Name = "ClipboardHandle";
this.Opacity = 0D;
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "";
this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnClose);
this.Load += new System.EventHandler(this.OnLoad);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Label lblInformation;
}
}

View File

@@ -0,0 +1,386 @@
#region Copyright
/*
* The SharpClipboard Handle.
* ---------------------------------------------+
* Please preserve this window.
* It acts as the core message-processing handle
* for receiving broadcasted clipboard messages.
*
* The window however will not be visible to
* end users both via the Taskbar and the Task-
* Manager so no need to panic. At the very least
* you may change the window's title using the
* static property 'SharpClipboard.HandleCaption'.
* ---------------------------------------------+
*
*/
#endregion
using System;
using System.Text;
using System.Drawing;
using System.Diagnostics;
using System.Windows.Forms;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace WK.Libraries.SharpClipboardNS.Views
{
/// <summary>
/// This window acts as a handle to the clipboard-monitoring process and
/// thus will be launched in the background once the component has started
/// the monitoring service. However, it won't be visible to anyone even via
/// the Task Manager.
/// </summary>
public partial class ClipboardHandle : Form
{
#region Constructor
/// <summary>
/// Initializes a new instance of <see cref="ClipboardHandle"/>.
/// </summary>
public ClipboardHandle()
{
InitializeComponent();
// [optional] Applies the default window title.
// This may only be necessary for forensic purposes.
Text = SharpClipboard.HandleCaption;
}
#endregion
#region Fields
private IntPtr _chainedWnd;
const int WM_DRAWCLIPBOARD = 0x0308;
const int WM_CHANGECBCHAIN = 0x030D;
private bool _ready;
private string _processName = string.Empty;
private string _executableName = string.Empty;
private string _executablePath = string.Empty;
#endregion
#region Properties
/// <summary>
/// Checks if the handle is ready to monitor the system clipboard.
/// It is used to provide a final value for use whenever the property
/// 'ObserveLastEntry' is enabled.
/// </summary>
[Browsable(false)]
internal bool Ready
{
get {
if (SharpClipboardInstance.ObserveLastEntry)
_ready = true;
return _ready;
}
set { _ready = value; }
}
/// <summary>
/// Gets or sets an active <see cref="SharpClipboard"/> instance
/// for use when managing the current clipboard handle.
/// </summary>
[Browsable(false)]
internal SharpClipboard SharpClipboardInstance { get; set; }
#endregion
#region Methods
#region Clipboard Management
#region Win32 Integration
[DllImport("user32.dll")]
static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
[DllImport("user32.dll")]
static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
#endregion
#region Clipboard Monitor
/// <summary>
/// Modifications in this overriden method have
/// been added to disable viewing of the handle-
/// window in the Task Manager.
/// </summary>
protected override CreateParams CreateParams
{
get {
var cp = base.CreateParams;
// Turn on WS_EX_TOOLWINDOW.
cp.ExStyle |= 0x80;
return cp;
}
}
/// <summary>
/// This is the main clipboard detection method.
/// Algorithmic customizations are most welcome.
/// </summary>
/// <param name="m">The processed window-reference message.</param>
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
// If clipboard-monitoring is enabled, proceed to listening.
if (Ready && SharpClipboardInstance.MonitorClipboard)
{
IDataObject dataObj;
int retryCount = 0;
while (true)
{
try
{
dataObj = Clipboard.GetDataObject();
break;
}
catch (ExternalException)
{
// Crashes when large data is copied from clipboard
// without retries. We'll therefore need to do a 5-step
// retry count to cut some slack for the operation to
// fully complete and ensure that the data is captured;
// if all else fails, then throw an exception.
// You may extend the retries if need be.
if (++retryCount > 5)
throw;
System.Threading.Thread.Sleep(100);
}
}
try
{
// Determines whether a file/files have been cut/copied.
if ((SharpClipboardInstance.ObservableFormats.Files == true) &&
(dataObj.GetDataPresent(DataFormats.FileDrop)))
{
string[] capturedFiles = (string[])dataObj.GetData(DataFormats.FileDrop);
// If the 'capturedFiles' string array persists as null, then this means
// that the copied content is of a complex object type since the file-drop
// format is able to capture more-than-just-file content in the clipboard.
// Therefore assign the content its rightful type.
if (capturedFiles == null)
{
SharpClipboardInstance.ClipboardObject = dataObj;
SharpClipboardInstance.ClipboardText = dataObj.GetData(DataFormats.UnicodeText).ToString();
SharpClipboardInstance.Invoke(dataObj, SharpClipboard.ContentTypes.Other,
new SourceApplication(GetForegroundWindow(), SharpClipboardInstance.ForegroundWindowHandle(),
GetApplicationName(), GetActiveWindowTitle(), GetApplicationPath()));
}
else
{
// Clear all existing files before update.
SharpClipboardInstance.ClipboardFiles.Clear();
SharpClipboardInstance.ClipboardFiles.AddRange(capturedFiles);
SharpClipboardInstance.ClipboardFile = capturedFiles[0];
SharpClipboardInstance.Invoke(capturedFiles, SharpClipboard.ContentTypes.Files,
new SourceApplication(GetForegroundWindow(), SharpClipboardInstance.ForegroundWindowHandle(),
GetApplicationName(), GetActiveWindowTitle(), GetApplicationPath()));
}
}
// Determines whether text has been cut/copied.
else if ((SharpClipboardInstance.ObservableFormats.Texts == true) &&
(dataObj.GetDataPresent(DataFormats.Text) || dataObj.GetDataPresent(DataFormats.UnicodeText)))
{
string capturedText = dataObj.GetData(DataFormats.UnicodeText).ToString();
SharpClipboardInstance.ClipboardText = capturedText;
SharpClipboardInstance.Invoke(capturedText, SharpClipboard.ContentTypes.Text,
new SourceApplication(GetForegroundWindow(), SharpClipboardInstance.ForegroundWindowHandle(),
GetApplicationName(), GetActiveWindowTitle(), GetApplicationPath()));
}
// Determines whether an image has been cut/copied.
else if ((SharpClipboardInstance.ObservableFormats.Images == true) &&
(dataObj.GetDataPresent(DataFormats.Bitmap)))
{
Image capturedImage = dataObj.GetData(DataFormats.Bitmap) as Image;
SharpClipboardInstance.ClipboardImage = capturedImage;
SharpClipboardInstance.Invoke(capturedImage, SharpClipboard.ContentTypes.Image,
new SourceApplication(GetForegroundWindow(), SharpClipboardInstance.ForegroundWindowHandle(),
GetApplicationName(), GetActiveWindowTitle(), GetApplicationPath()));
}
// Determines whether a complex object has been cut/copied.
else if ((SharpClipboardInstance.ObservableFormats.Others == true) &&
!(dataObj.GetDataPresent(DataFormats.FileDrop)))
{
SharpClipboardInstance.Invoke(dataObj, SharpClipboard.ContentTypes.Other,
new SourceApplication(GetForegroundWindow(), SharpClipboardInstance.ForegroundWindowHandle(),
GetApplicationName(), GetActiveWindowTitle(), GetApplicationPath()));
}
}
catch (AccessViolationException)
{
// Use-cases such as Remote Desktop usage might throw this exception.
// Applications with Administrative privileges can however override
// this exception when run in a production environment.
}
catch (NullReferenceException) { }
}
// Provides support for multi-instance clipboard monitoring.
SendMessage(_chainedWnd, m.Msg, m.WParam, m.LParam);
break;
case WM_CHANGECBCHAIN:
if (m.WParam == _chainedWnd)
_chainedWnd = m.LParam;
else
SendMessage(_chainedWnd, m.Msg, m.WParam, m.LParam);
break;
}
}
#endregion
#region Helper Methods
public void StartMonitoring()
{
this.Show();
}
public void StopMonitoring()
{
this.Close();
}
#endregion
#endregion
#region Source App Management
#region Win32 Externals
[DllImport("user32.dll")]
static extern int GetForegroundWindow();
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindowPtr();
[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
[DllImport("user32")]
private static extern UInt32 GetWindowThreadProcessId(Int32 hWnd, out Int32 lpdwProcessId);
#endregion
#region Helper Methods
private Int32 GetProcessID(Int32 hwnd)
{
Int32 processID = 1;
GetWindowThreadProcessId(hwnd, out processID);
return processID;
}
private string GetApplicationName()
{
try
{
Int32 hwnd = 0;
hwnd = GetForegroundWindow();
_processName = Process.GetProcessById(GetProcessID(hwnd)).ProcessName;
_executablePath = Process.GetProcessById(GetProcessID(hwnd)).MainModule.FileName;
_executableName = _executablePath.Substring(_executablePath.LastIndexOf(@"\") + 1);
}
catch (Exception) { }
return _executableName;
}
private string GetApplicationPath()
{
return _executablePath;
}
private string GetActiveWindowTitle()
{
const int capacity = 256;
StringBuilder content = null;
IntPtr handle = IntPtr.Zero;
try
{
content = new StringBuilder(capacity);
handle = SharpClipboardInstance.ForegroundWindowHandle();
}
catch (Exception) { }
if (GetWindowText(handle, content, capacity) > 0)
return content.ToString();
return null;
}
#endregion
#endregion
#endregion
#region Events
private void OnLoad(object sender, EventArgs e)
{
// Start listening for clipboard changes.
_chainedWnd = SetClipboardViewer(this.Handle);
Ready = true;
}
private void OnClose(object sender, FormClosingEventArgs e)
{
// Stop listening to clipboard changes.
ChangeClipboardChain(this.Handle, _chainedWnd);
_chainedWnd = IntPtr.Zero;
}
#endregion
}
}

View File

@@ -0,0 +1,176 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="pictureBox1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABGdBTUEAALGPC/xhBQAACEpJREFUeF7t
nW2IFVUYx83eg8he6NUszUoqQkmovoSSH/SDgZRlfbAgqcAikkqsSCO1F2sRIiqIAj9ESW9ircTeu677
Zi+7aplFmVZaVtiLJthqm9v/Gf6zjMfn7HWdOefO3Ht+8Ocue545z/Occ2bumbkzZ4YEAoFAIBAIBAKB
QCDQT2dn52ktLS1ToDnQK2vWrMFHyxbqT0Px/1eDl/H5AD4nSx2sLlCJ5cuXH42Gmwgthj6F/oP6UqoX
kroWoUMmiA+6Cwhs9KnQMkhGstaIWUp8LENnTOrr6zuKYdQfSH5oc3PzjWiM9YnG8a1uaFpddYQki2P5
LUj8y0RDVFtfQNMZYu2C3f4aJCqjTmuEqgsDowt75dUMt3bATOREJNgA/ZtM+DD1K/QOGudJdOAMaGxb
W9uojo6OM/F5qoh/j5IysRFb2Qb6jXUMRvux/RLUcwLDLzZomEuQ1AYjyYHUiwYoQbNbW1svYzVHhBzu
MKIvR2Pei3qbocHMqtZhu9GsqpigEeVY/7eRmE1boTnt7e3ncvPMKZfL54kP+tJiMLVLJgrcvFgg+HnQ
gUQyNn2NjpqJ0XYMN3WO+ILP2+H7GyMWTZLDQ9w0/0hyCPj1RAI27ZSGr+YUkDOymYjldyM2TS/Cfig3
zSeSEAI9nMZ/1+WhZrBg0AxHR7yvxHmQYPdqNQdMRRCgXINRg6f2yIijee7g3rDHiPkgweYlmucLBPao
FnBC36GDrqB5bsHM60rE+r0Ru6l5NM8HaNgZSpBJrYfN2TTPPXJ4RMyfGzkkdQAD7maaVxfO861TTQTa
3tTUdArNCwMGzDCJXcuJ2g2b6p4ndHV1nYRABrqm043RdDLNC4fEjhwGuli4UdqA5v7BCFmiBBVrG0bI
cJoWFnTCCOTys5Fbv9AGT9HUL3KZAAHsNwOienAGeRVNC49coENOtlz3ofxSmvqBJzDW4yPK7qJpzYCc
Zmu5Uq1ezw/k+ogSRKz3aFZT8CRzpZFrv9BBN9DULQhkKBx+ZQZA/VUqlc6iqTMUv5FY7AyZSsPPbtMv
tcHLXgBH0wzH/cIouJ9mTtF8i1jsFHTCg5pvairN3AEnaw2nsTZjSnYszZyi+I7EYqds2rTpOPhSz5Tl
e5FmbkDvj9cci1B2B82co/kXsdg5yHWW5l+EsrE0yx708AuaU2irr9EvKP4jsdg5kiv8/WD6pxpoli10
qv7Gio6ZSzMvaDGIWOwF+HvE9E/twF6Q/Y9LqHSy4kzUm6dr+77AoDsfuau/MWOafj3NsgMd8JzmDIF8
QJO6A/l/ZLaHCG31NE2yAxV/ZjoSoQPupEndgYa+R2sTaC1NskHuvUGl6u6GIC6kWd2B3EdrbQL1omwY
zdKDyiYpTkQ/0qRuQRvYrpROpEl6cJixXYh6gyZ1C9rgLaNNIsnhiSbpQQeo8384eYwmXtFiEbHYK2ib
+VosaJulNEkPKlS/7aGq3FGsxBGJxV5BQ9t+D19Fk/Sgso1G5ZHQ++No4hUtFhGLvYIOsF2e2UCT9KAy
9bS7XC5fQBOvaLGIWOwVDMKRWizQVpqkB5X9YVQeqVoPwGmxiFjsFewBZ2ixQDtpkh5Uts+oPJJcmqWJ
V7RYRCz2SmNj4/FaLFAPTdKDykIHWPDVAeEQZMHXISh8CVuQR6O0WKAtNEkPKgvTUAu+pqGrjMojyUkI
TbyixSJisVcwCG/TYsH/s7tMj4ZeanEynyZe0WIRsdgr8PuEGQf1PE3Sg4bO1cU4JY5ILPYKBuebWixo
s7tpkh44sV2O3kYTryhxRGKxV+D3JzMOEdpsAk3Sw9u01ZtT0dMX08wbWhwiFnsDjTxGiwPqyfy2dVT6
ieEkEoKYRRNvaHGIWOwN5K7+JIlBmf0NWqh4kemIaqKJN5QYIrHYG/C52oxBhI5ZQJPsQKW27wHvt6Uo
MURisRcwyq23paDsOpplBzpAHsDeYTqjHqaZFxT/kVjsBfiTlQC0OLbLHeQ0yxZU/ozhLJbcDeZtdRHF
fyQWO4erv/xi+qcW0Sx7+FiS5lSOe9n9CF0Bzb+Ixc5BrrL6ihoDysbQzA1w0mk6per+9nSojWbuQA/b
7hEVeXmCXPEbicVOgZ/HTb+x0DaTaOYWOJNlILUg9mIGMJJmzlD8RmKxM3jpea/pl+qgmXvCQ3qHCgPP
z0N6MXDaaAaR0Bya1Qxo4LlKnrFW0swfdfigtvq7OOT/Qe0YjIqBlirYXq2fLLNEvtOQi+0EVA491Vmq
QOBjS7ZpqWgL9pRzaF44JHbkMNACfx2+pt5WKi1XA3XLup40LwwSM2JfZ+SSVPWXq4lBIJUWbPpWdmWa
5x5ONzcbOSSVnwWbYhBQpSXLdsiXGc1zC+K8FrJd54mVryXLYuQLSQk2KXl0Z4Gzq4UpkJgkNonRiPkg
wWYhN8kfPFl5zQxaUa6WrZQVdTF4ir9sZQySGeikJdZeGXFybyU384745qi3XV7ol+TEzYoBgpYnyWtl
6WKvPzhlBgKfDu1iIpUkL+DJ3eLd6KybuHkxwUgbCX2sJGeT/M5axjaZLV+P+u6DBrt8fTcav9jL18fI
2SIaVJ4m/MdI8nB0yAscsJeMSK5FKn/L/2AzDra3wmahbAMd0QscoGdRR228wCEJZxtvGwnnSR8ixosY
bu2CROW7oZpvTzJVHy/xScJzhinYI/ChNooP1d9rrDRwvB2DjpCz6O2JxnElubTcAJ/j6T4Qg5EoS2JO
ZGfI8jiDmbXYFL/KcDEaPbzKcDCUSqXT0WiT0SHyfIK8BmsF/u7CZ/wyz7iRo5d5smwF1CDbyLbhZZ6B
QCAQCAQCgUAgEEgwZMj/Dc7t3j0iwbAAAAAASUVORK5CYII=
</value>
</data>
<metadata name="lblInformation.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="lblInformation.Text" xml:space="preserve">
<value>Please note that this window acts as a handle to the clipboard-monitoring
process and thus will be launched in the background once the component
has started the monitoring service. However, it won't be visible to anyone.</value>
</data>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@@ -0,0 +1 @@
theme: jekyll-theme-cayman