├── .gitignore ├── README.md ├── VirtualDesktopManager.sln └── VirtualDestopCycle ├── App.config ├── Form1.Designer.cs ├── Form1.cs ├── Form1.resx ├── Native.cs ├── Program.cs ├── Properties ├── AssemblyInfo.cs ├── Resources.Designer.cs ├── Resources.resx ├── Settings.Designer.cs └── Settings.settings ├── Resources ├── 1.ico ├── 2.ico ├── 3.ico ├── 4.ico ├── 5.ico ├── 6.ico ├── 7.ico ├── 8.ico ├── 9.ico ├── 9plus.ico ├── mainIco.ico └── mainIco.png ├── VirtualDesktopManager.csproj ├── app.manifest └── packages.config /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/visualstudio 3 | 4 | ### VisualStudio ### 5 | ## Ignore Visual Studio temporary files, build results, and 6 | ## files generated by popular Visual Studio add-ons. 7 | 8 | # User-specific files 9 | *.suo 10 | *.user 11 | *.userosscache 12 | *.sln.docstates 13 | 14 | # User-specific files (MonoDevelop/Xamarin Studio) 15 | *.userprefs 16 | 17 | # Build results 18 | [Dd]ebug/ 19 | [Dd]ebugPublic/ 20 | [Rr]elease/ 21 | [Rr]eleases/ 22 | x64/ 23 | x86/ 24 | bld/ 25 | [Bb]in/ 26 | [Oo]bj/ 27 | [Ll]og/ 28 | 29 | # Visual Studio 2015 cache/options directory 30 | .vs/ 31 | # Uncomment if you have tasks that create the project's static files in wwwroot 32 | #wwwroot/ 33 | 34 | # MSTest test Results 35 | [Tt]est[Rr]esult*/ 36 | [Bb]uild[Ll]og.* 37 | 38 | # NUNIT 39 | *.VisualState.xml 40 | TestResult.xml 41 | 42 | # Build Results of an ATL Project 43 | [Dd]ebugPS/ 44 | [Rr]eleasePS/ 45 | dlldata.c 46 | 47 | # DNX 48 | project.lock.json 49 | artifacts/ 50 | 51 | *_i.c 52 | *_p.c 53 | *_i.h 54 | *.ilk 55 | *.meta 56 | *.obj 57 | *.pch 58 | *.pdb 59 | *.pgc 60 | *.pgd 61 | *.rsp 62 | *.sbr 63 | *.tlb 64 | *.tli 65 | *.tlh 66 | *.tmp 67 | *.tmp_proj 68 | *.log 69 | *.vspscc 70 | *.vssscc 71 | .builds 72 | *.pidb 73 | *.svclog 74 | *.scc 75 | 76 | # Chutzpah Test files 77 | _Chutzpah* 78 | 79 | # Visual C++ cache files 80 | ipch/ 81 | *.aps 82 | *.ncb 83 | *.opendb 84 | *.opensdf 85 | *.sdf 86 | *.cachefile 87 | 88 | # Visual Studio profiler 89 | *.psess 90 | *.vsp 91 | *.vspx 92 | *.sap 93 | 94 | # TFS 2012 Local Workspace 95 | $tf/ 96 | 97 | # Guidance Automation Toolkit 98 | *.gpState 99 | 100 | # ReSharper is a .NET coding add-in 101 | _ReSharper*/ 102 | *.[Rr]e[Ss]harper 103 | *.DotSettings.user 104 | 105 | # JustCode is a .NET coding add-in 106 | .JustCode 107 | 108 | # TeamCity is a build add-in 109 | _TeamCity* 110 | 111 | # DotCover is a Code Coverage Tool 112 | *.dotCover 113 | 114 | # NCrunch 115 | _NCrunch_* 116 | .*crunch*.local.xml 117 | nCrunchTemp_* 118 | 119 | # MightyMoose 120 | *.mm.* 121 | AutoTest.Net/ 122 | 123 | # Web workbench (sass) 124 | .sass-cache/ 125 | 126 | # Installshield output folder 127 | [Ee]xpress/ 128 | 129 | # DocProject is a documentation generator add-in 130 | DocProject/buildhelp/ 131 | DocProject/Help/*.HxT 132 | DocProject/Help/*.HxC 133 | DocProject/Help/*.hhc 134 | DocProject/Help/*.hhk 135 | DocProject/Help/*.hhp 136 | DocProject/Help/Html2 137 | DocProject/Help/html 138 | 139 | # Click-Once directory 140 | publish/ 141 | 142 | # Publish Web Output 143 | *.[Pp]ublish.xml 144 | *.azurePubxml 145 | # TODO: Comment the next line if you want to checkin your web deploy settings 146 | # but database connection strings (with potential passwords) will be unencrypted 147 | *.pubxml 148 | *.publishproj 149 | 150 | # NuGet Packages 151 | *.nupkg 152 | # The packages folder can be ignored because of Package Restore 153 | **/packages/* 154 | # except build/, which is used as an MSBuild target. 155 | !**/packages/build/ 156 | # Uncomment if necessary however generally it will be regenerated when needed 157 | #!**/packages/repositories.config 158 | # NuGet v3's project.json files produces more ignoreable files 159 | *.nuget.props 160 | *.nuget.targets 161 | 162 | # Microsoft Azure Build Output 163 | csx/ 164 | *.build.csdef 165 | 166 | # Microsoft Azure Emulator 167 | ecf/ 168 | rcf/ 169 | 170 | # Windows Store app package directories and files 171 | AppPackages/ 172 | BundleArtifacts/ 173 | Package.StoreAssociation.xml 174 | _pkginfo.txt 175 | 176 | # Visual Studio cache files 177 | # files ending in .cache can be ignored 178 | *.[Cc]ache 179 | # but keep track of directories ending in .cache 180 | !*.[Cc]ache/ 181 | 182 | # Others 183 | ClientBin/ 184 | ~$* 185 | *~ 186 | *.dbmdl 187 | *.dbproj.schemaview 188 | *.pfx 189 | *.publishsettings 190 | node_modules/ 191 | orleans.codegen.cs 192 | 193 | # Since there are multiple workflows, uncomment next line to ignore bower_components 194 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 195 | #bower_components/ 196 | 197 | # RIA/Silverlight projects 198 | Generated_Code/ 199 | 200 | # Backup & report files from converting an old project file 201 | # to a newer Visual Studio version. Backup files are not needed, 202 | # because we have git ;-) 203 | _UpgradeReport_Files/ 204 | Backup*/ 205 | UpgradeLog*.XML 206 | UpgradeLog*.htm 207 | 208 | # SQL Server files 209 | *.mdf 210 | *.ldf 211 | 212 | # Business Intelligence projects 213 | *.rdl.data 214 | *.bim.layout 215 | *.bim_*.settings 216 | 217 | # Microsoft Fakes 218 | FakesAssemblies/ 219 | 220 | # GhostDoc plugin setting file 221 | *.GhostDoc.xml 222 | 223 | # Node.js Tools for Visual Studio 224 | .ntvs_analysis.dat 225 | 226 | # Visual Studio 6 build log 227 | *.plg 228 | 229 | # Visual Studio 6 workspace options file 230 | *.opt 231 | 232 | # Visual Studio LightSwitch build output 233 | **/*.HTMLClient/GeneratedArtifacts 234 | **/*.DesktopClient/GeneratedArtifacts 235 | **/*.DesktopClient/ModelManifest.xml 236 | **/*.Server/GeneratedArtifacts 237 | **/*.Server/ModelManifest.xml 238 | _Pvt_Extensions 239 | 240 | # Paket dependency manager 241 | .paket/paket.exe 242 | paket-files/ 243 | 244 | # FAKE - F# Make 245 | .fake/ 246 | 247 | # JetBrains Rider 248 | .idea/ 249 | *.sln.iml 250 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | VirtualDesktopManager 2 | ====== 3 | About 4 | ------------------------ 5 | This program was made for people who are using Windows 10's built-in Virtual Desktops, but who don't like the default key-binding, don't like how you can't cycle through your desktops (If you are on your last one you don't want to hotkey over to the first one 8 times), and don't like not knowing what desktop # they are on. 6 | 7 | Install 8 | ------------------------ 9 | There is no installation. Just download the .zip from the Releases, extract it and then run VirtualDesktopManager.exe. 10 | 11 | You can use Task Scheduler to make it launch when you login so you don't have to launch it manually every reboot. 12 | 13 | Usage 14 | ------------------------ 15 | 16 | You can continue to use the default hotkey to change desktops (Ctrl+Win+Left/Right), but you won't get any of the benefit of the program except knowing which desktop you are on. 17 | 18 | I have added a listener to the hotkey of Ctrl+Alt+Left/Right. With this hotkey, you can cycle through your virtual desktops. If this hotkey doesn't work on your system (Intel utility already uses it), you can open up the settings and select the alternate hotkey (Shift+Alt+Left/Right). 19 | 20 | As of v1.5.0, you are no longer limited to 9 desktops. The icon will automatically update up to 999 desktops (can you handle that many?). 21 | 22 | 23 | Limitations 24 | ------------------------ 25 | * Due to not wanting to make lots of tray icons, this program only supports up to 9 virtual desktops (it will crash if you go above that). 26 | * If you try switch between desktops too quickly, windows on different desktops will try to gain focus (you'll see what I mean when you try it out). 27 | * It needs more testing to see how well it will handle suspend/hibernation events. 28 | * You will need to relaunch the program if explorer.exe crashes. 29 | * Hotkeys are statically coded in, so if you want to configure them, you'll have to modify the source. 30 | * It doesn't handle it very well when you add or create virtual desktops while it's running. You'll need to relaunch it. 31 | 32 | I'm trying to work on these issues, but if you have a solution, just throw in a PR and I'll take a look. 33 | -------------------------------------------------------------------------------- /VirtualDesktopManager.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.24720.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualDesktopManager", "VirtualDestopCycle\VirtualDesktopManager.csproj", "{065F69EE-7316-4CB0-97A0-224CC1045C37}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Debug|x64 = Debug|x64 12 | Release|Any CPU = Release|Any CPU 13 | Release|x64 = Release|x64 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {065F69EE-7316-4CB0-97A0-224CC1045C37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {065F69EE-7316-4CB0-97A0-224CC1045C37}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {065F69EE-7316-4CB0-97A0-224CC1045C37}.Debug|x64.ActiveCfg = Debug|x64 19 | {065F69EE-7316-4CB0-97A0-224CC1045C37}.Debug|x64.Build.0 = Debug|x64 20 | {065F69EE-7316-4CB0-97A0-224CC1045C37}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {065F69EE-7316-4CB0-97A0-224CC1045C37}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {065F69EE-7316-4CB0-97A0-224CC1045C37}.Release|x64.ActiveCfg = Release|x64 23 | {065F69EE-7316-4CB0-97A0-224CC1045C37}.Release|x64.Build.0 = Release|x64 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /VirtualDestopCycle/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | False 15 | 16 | 17 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace VirtualDesktopManager 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.components = new System.ComponentModel.Container(); 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); 33 | this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); 34 | this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); 35 | this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 36 | this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 37 | this.checkBox1 = new System.Windows.Forms.CheckBox(); 38 | this.groupBox1 = new System.Windows.Forms.GroupBox(); 39 | this.removeButton = new System.Windows.Forms.Button(); 40 | this.downButton = new System.Windows.Forms.Button(); 41 | this.upButton = new System.Windows.Forms.Button(); 42 | this.listView1 = new System.Windows.Forms.ListView(); 43 | this.addFileButton = new System.Windows.Forms.Button(); 44 | this.saveButton = new System.Windows.Forms.Button(); 45 | this.pictureBox1 = new System.Windows.Forms.PictureBox(); 46 | this.labelStatus = new System.Windows.Forms.Label(); 47 | this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); 48 | this.contextMenuStrip1.SuspendLayout(); 49 | this.groupBox1.SuspendLayout(); 50 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); 51 | this.SuspendLayout(); 52 | // 53 | // notifyIcon1 54 | // 55 | this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1; 56 | this.notifyIcon1.Icon = global::VirtualDesktopManager.Properties.Resources.mainIco; 57 | this.notifyIcon1.Text = "Virtual Desktop Manager"; 58 | this.notifyIcon1.Visible = true; 59 | this.notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick); 60 | // 61 | // contextMenuStrip1 62 | // 63 | this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(28, 28); 64 | this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 65 | this.settingsToolStripMenuItem, 66 | this.exitToolStripMenuItem}); 67 | this.contextMenuStrip1.Name = "contextMenuStrip1"; 68 | this.contextMenuStrip1.Size = new System.Drawing.Size(117, 48); 69 | // 70 | // settingsToolStripMenuItem 71 | // 72 | this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; 73 | this.settingsToolStripMenuItem.Size = new System.Drawing.Size(116, 22); 74 | this.settingsToolStripMenuItem.Text = "Settings"; 75 | this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click); 76 | // 77 | // exitToolStripMenuItem 78 | // 79 | this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; 80 | this.exitToolStripMenuItem.Size = new System.Drawing.Size(116, 22); 81 | this.exitToolStripMenuItem.Text = "Exit"; 82 | this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); 83 | // 84 | // checkBox1 85 | // 86 | this.checkBox1.AutoSize = true; 87 | this.checkBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 88 | this.checkBox1.ForeColor = System.Drawing.Color.White; 89 | this.checkBox1.Location = new System.Drawing.Point(14, 54); 90 | this.checkBox1.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); 91 | this.checkBox1.Name = "checkBox1"; 92 | this.checkBox1.Size = new System.Drawing.Size(353, 21); 93 | this.checkBox1.TabIndex = 1; 94 | this.checkBox1.Text = "Use alternate key combination (Shift+Alt+Left/Right)"; 95 | this.checkBox1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 96 | this.checkBox1.UseVisualStyleBackColor = true; 97 | // 98 | // groupBox1 99 | // 100 | this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 101 | | System.Windows.Forms.AnchorStyles.Right))); 102 | this.groupBox1.BackColor = System.Drawing.Color.Black; 103 | this.groupBox1.Controls.Add(this.removeButton); 104 | this.groupBox1.Controls.Add(this.downButton); 105 | this.groupBox1.Controls.Add(this.upButton); 106 | this.groupBox1.Controls.Add(this.listView1); 107 | this.groupBox1.Controls.Add(this.addFileButton); 108 | this.groupBox1.Controls.Add(this.saveButton); 109 | this.groupBox1.Controls.Add(this.checkBox1); 110 | this.groupBox1.Font = new System.Drawing.Font("Segoe UI", 20F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 111 | this.groupBox1.ForeColor = System.Drawing.Color.White; 112 | this.groupBox1.Location = new System.Drawing.Point(8, 9); 113 | this.groupBox1.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); 114 | this.groupBox1.Name = "groupBox1"; 115 | this.groupBox1.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3); 116 | this.groupBox1.Size = new System.Drawing.Size(593, 347); 117 | this.groupBox1.TabIndex = 3; 118 | this.groupBox1.TabStop = false; 119 | this.groupBox1.Text = "Settings"; 120 | // 121 | // removeButton 122 | // 123 | this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 124 | this.removeButton.BackColor = System.Drawing.Color.Black; 125 | this.removeButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 126 | this.removeButton.Font = new System.Drawing.Font("Segoe UI", 12F); 127 | this.removeButton.ForeColor = System.Drawing.Color.White; 128 | this.removeButton.Location = new System.Drawing.Point(175, 282); 129 | this.removeButton.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); 130 | this.removeButton.Name = "removeButton"; 131 | this.removeButton.Size = new System.Drawing.Size(144, 37); 132 | this.removeButton.TabIndex = 7; 133 | this.removeButton.Text = "Remove file"; 134 | this.removeButton.UseVisualStyleBackColor = false; 135 | this.removeButton.Click += new System.EventHandler(this.removeButton_Click); 136 | // 137 | // downButton 138 | // 139 | this.downButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 140 | this.downButton.BackColor = System.Drawing.Color.Black; 141 | this.downButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 142 | this.downButton.Font = new System.Drawing.Font("Wingdings", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(2))); 143 | this.downButton.ForeColor = System.Drawing.Color.White; 144 | this.downButton.Location = new System.Drawing.Point(539, 188); 145 | this.downButton.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); 146 | this.downButton.Name = "downButton"; 147 | this.downButton.Size = new System.Drawing.Size(41, 37); 148 | this.downButton.TabIndex = 6; 149 | this.downButton.Text = "â"; 150 | this.downButton.UseVisualStyleBackColor = false; 151 | this.downButton.Click += new System.EventHandler(this.downButton_Click); 152 | // 153 | // upButton 154 | // 155 | this.upButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 156 | this.upButton.BackColor = System.Drawing.Color.Black; 157 | this.upButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 158 | this.upButton.Font = new System.Drawing.Font("Wingdings", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(2))); 159 | this.upButton.ForeColor = System.Drawing.Color.White; 160 | this.upButton.Location = new System.Drawing.Point(539, 128); 161 | this.upButton.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); 162 | this.upButton.Name = "upButton"; 163 | this.upButton.Size = new System.Drawing.Size(41, 37); 164 | this.upButton.TabIndex = 5; 165 | this.upButton.Text = "á"; 166 | this.upButton.UseVisualStyleBackColor = false; 167 | this.upButton.Click += new System.EventHandler(this.upButton_Click); 168 | // 169 | // listView1 170 | // 171 | this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 172 | | System.Windows.Forms.AnchorStyles.Left) 173 | | System.Windows.Forms.AnchorStyles.Right))); 174 | this.listView1.Font = new System.Drawing.Font("Segoe UI", 12F); 175 | this.listView1.HideSelection = false; 176 | this.listView1.Location = new System.Drawing.Point(14, 98); 177 | this.listView1.Name = "listView1"; 178 | this.listView1.ShowGroups = false; 179 | this.listView1.ShowItemToolTips = true; 180 | this.listView1.Size = new System.Drawing.Size(508, 168); 181 | this.listView1.TabIndex = 4; 182 | this.listView1.UseCompatibleStateImageBehavior = false; 183 | this.listView1.View = System.Windows.Forms.View.Details; 184 | // 185 | // addFileButton 186 | // 187 | this.addFileButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 188 | this.addFileButton.BackColor = System.Drawing.Color.Black; 189 | this.addFileButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 190 | this.addFileButton.Font = new System.Drawing.Font("Segoe UI", 12F); 191 | this.addFileButton.ForeColor = System.Drawing.Color.White; 192 | this.addFileButton.Location = new System.Drawing.Point(14, 282); 193 | this.addFileButton.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); 194 | this.addFileButton.Name = "addFileButton"; 195 | this.addFileButton.Size = new System.Drawing.Size(144, 37); 196 | this.addFileButton.TabIndex = 3; 197 | this.addFileButton.Text = "Add background"; 198 | this.addFileButton.UseVisualStyleBackColor = false; 199 | this.addFileButton.Click += new System.EventHandler(this.addFileButton_Click); 200 | // 201 | // saveButton 202 | // 203 | this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 204 | this.saveButton.BackColor = System.Drawing.Color.Black; 205 | this.saveButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 206 | this.saveButton.Font = new System.Drawing.Font("Segoe UI", 12F); 207 | this.saveButton.ForeColor = System.Drawing.Color.White; 208 | this.saveButton.Location = new System.Drawing.Point(477, 45); 209 | this.saveButton.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); 210 | this.saveButton.Name = "saveButton"; 211 | this.saveButton.Size = new System.Drawing.Size(103, 37); 212 | this.saveButton.TabIndex = 2; 213 | this.saveButton.Text = "Save"; 214 | this.saveButton.UseVisualStyleBackColor = false; 215 | this.saveButton.Click += new System.EventHandler(this.saveButton_Click); 216 | // 217 | // pictureBox1 218 | // 219 | this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 220 | this.pictureBox1.Location = new System.Drawing.Point(8, 363); 221 | this.pictureBox1.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); 222 | this.pictureBox1.Name = "pictureBox1"; 223 | this.pictureBox1.Size = new System.Drawing.Size(171, 76); 224 | this.pictureBox1.TabIndex = 4; 225 | this.pictureBox1.TabStop = false; 226 | // 227 | // labelStatus 228 | // 229 | this.labelStatus.AutoSize = true; 230 | this.labelStatus.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F); 231 | this.labelStatus.Location = new System.Drawing.Point(184, 363); 232 | this.labelStatus.Name = "labelStatus"; 233 | this.labelStatus.Size = new System.Drawing.Size(0, 17); 234 | this.labelStatus.TabIndex = 5; 235 | // 236 | // openFileDialog1 237 | // 238 | this.openFileDialog1.FileName = "openFileDialog1"; 239 | // 240 | // Form1 241 | // 242 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 243 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 244 | this.BackColor = System.Drawing.SystemColors.ActiveCaptionText; 245 | this.ClientSize = new System.Drawing.Size(609, 451); 246 | this.Controls.Add(this.labelStatus); 247 | this.Controls.Add(this.pictureBox1); 248 | this.Controls.Add(this.groupBox1); 249 | this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F); 250 | this.ForeColor = System.Drawing.Color.White; 251 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; 252 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 253 | this.Margin = new System.Windows.Forms.Padding(1); 254 | this.Name = "Form1"; 255 | this.ShowIcon = false; 256 | this.ShowInTaskbar = false; 257 | this.Text = "Virtual Desktop Manager"; 258 | this.WindowState = System.Windows.Forms.FormWindowState.Minimized; 259 | this.Load += new System.EventHandler(this.Form1_Load); 260 | this.contextMenuStrip1.ResumeLayout(false); 261 | this.groupBox1.ResumeLayout(false); 262 | this.groupBox1.PerformLayout(); 263 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); 264 | this.ResumeLayout(false); 265 | this.PerformLayout(); 266 | 267 | } 268 | 269 | #endregion 270 | 271 | 272 | 273 | private System.Windows.Forms.NotifyIcon notifyIcon1; 274 | private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; 275 | private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; 276 | private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; 277 | private System.Windows.Forms.CheckBox checkBox1; 278 | private System.Windows.Forms.GroupBox groupBox1; 279 | private System.Windows.Forms.Button saveButton; 280 | private System.Windows.Forms.PictureBox pictureBox1; 281 | private System.Windows.Forms.Label labelStatus; 282 | private System.Windows.Forms.Button addFileButton; 283 | private System.Windows.Forms.OpenFileDialog openFileDialog1; 284 | private System.Windows.Forms.ListView listView1; 285 | private System.Windows.Forms.Button downButton; 286 | private System.Windows.Forms.Button upButton; 287 | private System.Windows.Forms.Button removeButton; 288 | } 289 | } 290 | 291 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Form1.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Windows.Forms; 5 | using System.Windows.Input; 6 | using System.Runtime.InteropServices; 7 | using WindowsDesktop; 8 | using GlobalHotKey; 9 | using System.Drawing; 10 | using System.IO; 11 | 12 | namespace VirtualDesktopManager 13 | { 14 | public partial class Form1 : Form 15 | { 16 | [DllImport("user32.dll", ExactSpelling = true)] 17 | static extern IntPtr GetForegroundWindow(); 18 | 19 | [DllImport("user32.dll")] 20 | [return: MarshalAs(UnmanagedType.Bool)] 21 | static extern bool SetForegroundWindow(IntPtr hWnd); 22 | 23 | private IList desktops; 24 | private IntPtr[] activePrograms; 25 | 26 | [DllImport("user32.dll", CharSet = CharSet.Auto)] 27 | extern static bool DestroyIcon(IntPtr handle); 28 | 29 | private readonly HotKeyManager _rightHotkey; 30 | private readonly HotKeyManager _leftHotkey; 31 | private readonly HotKeyManager _numberHotkey; 32 | 33 | private bool closeToTray; 34 | 35 | private bool useAltKeySettings; 36 | 37 | public Form1() 38 | { 39 | InitializeComponent(); 40 | 41 | handleChangedNumber(); 42 | 43 | closeToTray = true; 44 | 45 | _rightHotkey = new HotKeyManager(); 46 | _rightHotkey.KeyPressed += RightKeyManagerPressed; 47 | 48 | _leftHotkey = new HotKeyManager(); 49 | _leftHotkey.KeyPressed += LeftKeyManagerPressed; 50 | 51 | _numberHotkey = new HotKeyManager(); 52 | _numberHotkey.KeyPressed += NumberHotkeyPressed; 53 | 54 | VirtualDesktop.CurrentChanged += VirtualDesktop_CurrentChanged; 55 | VirtualDesktop.Created += VirtualDesktop_Added; 56 | VirtualDesktop.Destroyed += VirtualDesktop_Destroyed; 57 | 58 | this.FormClosing += Form1_FormClosing; 59 | 60 | useAltKeySettings = Properties.Settings.Default.AltHotKey; 61 | checkBox1.Checked = useAltKeySettings; 62 | 63 | listView1.Items.Clear(); 64 | listView1.Columns.Add("File").Width = 400; 65 | foreach (var file in Properties.Settings.Default.DesktopBackgroundFiles) 66 | { 67 | listView1.Items.Add(NewListViewItem(file)); 68 | } 69 | } 70 | 71 | private void NumberHotkeyPressed(object sender, KeyPressedEventArgs e) 72 | { 73 | var index = (int) e.HotKey.Key - (int)Key.D0 - 1; 74 | var currentDesktopIndex = getCurrentDesktopIndex(); 75 | 76 | if (index == currentDesktopIndex) 77 | { 78 | return; 79 | } 80 | 81 | if (index > desktops.Count - 1) 82 | { 83 | return; 84 | } 85 | 86 | desktops.ElementAt(index)?.Switch(); 87 | } 88 | 89 | private void Form1_FormClosing(object sender, FormClosingEventArgs e) 90 | { 91 | if (closeToTray) 92 | { 93 | e.Cancel = true; 94 | this.Visible = false; 95 | this.ShowInTaskbar = false; 96 | notifyIcon1.BalloonTipTitle = "Still Running..."; 97 | notifyIcon1.BalloonTipText = "Right-click on the tray icon to exit."; 98 | notifyIcon1.ShowBalloonTip(2000); 99 | } 100 | } 101 | 102 | private void handleChangedNumber() 103 | { 104 | desktops = VirtualDesktop.GetDesktops(); 105 | activePrograms = new IntPtr[desktops.Count]; 106 | } 107 | 108 | private void VirtualDesktop_Added(object sender, VirtualDesktop e) 109 | { 110 | handleChangedNumber(); 111 | } 112 | 113 | private void VirtualDesktop_Destroyed(object sender, VirtualDesktopDestroyEventArgs e) 114 | { 115 | handleChangedNumber(); 116 | } 117 | 118 | private void VirtualDesktop_CurrentChanged(object sender, VirtualDesktopChangedEventArgs e) 119 | { 120 | // 0 == first 121 | int currentDesktopIndex = getCurrentDesktopIndex(); 122 | 123 | string pictureFile = PickNthFile(currentDesktopIndex); 124 | if (pictureFile != null) 125 | { 126 | Native.SetBackground(pictureFile); 127 | } 128 | 129 | restoreApplicationFocus(currentDesktopIndex); 130 | changeTrayIcon(currentDesktopIndex); 131 | } 132 | 133 | private string PickNthFile(int currentDesktopIndex) 134 | { 135 | int n = Properties.Settings.Default.DesktopBackgroundFiles.Count; 136 | if (n == 0) 137 | return null; 138 | int index = currentDesktopIndex % n; 139 | return Properties.Settings.Default.DesktopBackgroundFiles[index]; 140 | } 141 | 142 | private void exitToolStripMenuItem_Click(object sender, EventArgs e) 143 | { 144 | _rightHotkey.Dispose(); 145 | _leftHotkey.Dispose(); 146 | _numberHotkey.Dispose(); 147 | 148 | closeToTray = false; 149 | 150 | this.Close(); 151 | } 152 | 153 | private void normalHotkeys() 154 | { 155 | try 156 | { 157 | _rightHotkey.Register(Key.Right, System.Windows.Input.ModifierKeys.Control | System.Windows.Input.ModifierKeys.Alt); 158 | _leftHotkey.Register(Key.Left, System.Windows.Input.ModifierKeys.Control | System.Windows.Input.ModifierKeys.Alt); 159 | RegisterNumberHotkeys(System.Windows.Input.ModifierKeys.Control | System.Windows.Input.ModifierKeys.Alt); 160 | } 161 | catch (Exception err) 162 | { 163 | notifyIcon1.BalloonTipTitle = "Error setting hotkeys"; 164 | notifyIcon1.BalloonTipText = "Could not set hotkeys. Please open settings and try the alternate combination."; 165 | notifyIcon1.ShowBalloonTip(2000); 166 | } 167 | } 168 | 169 | private void alternateHotkeys() 170 | { 171 | try 172 | { 173 | _rightHotkey.Register(Key.Right, System.Windows.Input.ModifierKeys.Shift | System.Windows.Input.ModifierKeys.Alt); 174 | _leftHotkey.Register(Key.Left, System.Windows.Input.ModifierKeys.Shift | System.Windows.Input.ModifierKeys.Alt); 175 | RegisterNumberHotkeys(System.Windows.Input.ModifierKeys.Shift | System.Windows.Input.ModifierKeys.Alt); 176 | } 177 | catch (Exception err) 178 | { 179 | notifyIcon1.BalloonTipTitle = "Error setting hotkeys"; 180 | notifyIcon1.BalloonTipText = "Could not set hotkeys. Please open settings and try the default combination."; 181 | notifyIcon1.ShowBalloonTip(2000); 182 | } 183 | } 184 | 185 | private void RegisterNumberHotkeys(ModifierKeys modifiers) 186 | { 187 | _numberHotkey.Register(Key.D1, modifiers); 188 | _numberHotkey.Register(Key.D2, modifiers); 189 | _numberHotkey.Register(Key.D3, modifiers); 190 | _numberHotkey.Register(Key.D4, modifiers); 191 | _numberHotkey.Register(Key.D5, modifiers); 192 | _numberHotkey.Register(Key.D6, modifiers); 193 | _numberHotkey.Register(Key.D7, modifiers); 194 | _numberHotkey.Register(Key.D8, modifiers); 195 | _numberHotkey.Register(Key.D9, modifiers); 196 | } 197 | 198 | private void Form1_Load(object sender, EventArgs e) 199 | { 200 | labelStatus.Text = ""; 201 | 202 | if (!useAltKeySettings) 203 | normalHotkeys(); 204 | else 205 | alternateHotkeys(); 206 | 207 | var desktop = initialDesktopState(); 208 | changeTrayIcon(); 209 | 210 | this.Visible = false; 211 | } 212 | 213 | private int getCurrentDesktopIndex() 214 | { 215 | return desktops.IndexOf(VirtualDesktop.Current); 216 | } 217 | 218 | private void saveApplicationFocus(int currentDesktopIndex = -1) 219 | { 220 | IntPtr activeAppWindow = GetForegroundWindow(); 221 | 222 | if (currentDesktopIndex == -1) 223 | currentDesktopIndex = getCurrentDesktopIndex(); 224 | 225 | activePrograms[currentDesktopIndex] = activeAppWindow; 226 | } 227 | 228 | private void restoreApplicationFocus(int currentDesktopIndex = -1) 229 | { 230 | if (currentDesktopIndex == -1) 231 | currentDesktopIndex = getCurrentDesktopIndex(); 232 | 233 | if (activePrograms[currentDesktopIndex] != null && activePrograms[currentDesktopIndex] != IntPtr.Zero) 234 | { 235 | SetForegroundWindow(activePrograms[currentDesktopIndex]); 236 | } 237 | } 238 | 239 | private void changeTrayIcon(int currentDesktopIndex = -1) 240 | { 241 | if(currentDesktopIndex == -1) 242 | currentDesktopIndex = getCurrentDesktopIndex(); 243 | 244 | var desktopNumber = currentDesktopIndex + 1; 245 | var desktopNumberString = desktopNumber.ToString(); 246 | 247 | var fontSize = 140; 248 | var xPlacement = 100; 249 | var yPlacement = 50; 250 | 251 | if(desktopNumber > 9 && desktopNumber < 100) 252 | { 253 | fontSize = 125; 254 | xPlacement = 75; 255 | yPlacement = 65; 256 | } else if(desktopNumber > 99) 257 | { 258 | fontSize = 80; 259 | xPlacement = 90; 260 | yPlacement = 100; 261 | } 262 | 263 | Bitmap newIcon = Properties.Resources.mainIcoPng; 264 | Font desktopNumberFont = new Font("Segoe UI", fontSize, FontStyle.Bold, GraphicsUnit.Pixel); 265 | 266 | var gr = Graphics.FromImage(newIcon); 267 | gr.DrawString(desktopNumberString, desktopNumberFont, Brushes.White, xPlacement, yPlacement); 268 | 269 | Icon numberedIcon = Icon.FromHandle(newIcon.GetHicon()); 270 | notifyIcon1.Icon = numberedIcon; 271 | 272 | DestroyIcon(numberedIcon.Handle); 273 | desktopNumberFont.Dispose(); 274 | newIcon.Dispose(); 275 | gr.Dispose(); 276 | } 277 | 278 | VirtualDesktop initialDesktopState() 279 | { 280 | var desktop = VirtualDesktop.Current; 281 | int desktopIndex = getCurrentDesktopIndex(); 282 | 283 | saveApplicationFocus(desktopIndex); 284 | 285 | return desktop; 286 | } 287 | 288 | void RightKeyManagerPressed(object sender, KeyPressedEventArgs e) 289 | { 290 | var desktop = initialDesktopState(); 291 | 292 | if(desktop.GetRight() != null) 293 | { 294 | desktop.GetRight()?.Switch(); 295 | } else 296 | { 297 | desktops.First()?.Switch(); 298 | } 299 | } 300 | 301 | void LeftKeyManagerPressed(object sender, KeyPressedEventArgs e) 302 | { 303 | var desktop = initialDesktopState(); 304 | 305 | if (desktop.GetLeft() != null) 306 | { 307 | desktop.GetLeft()?.Switch(); 308 | } 309 | else 310 | { 311 | desktops.Last()?.Switch(); 312 | } 313 | } 314 | 315 | private void openSettings() 316 | { 317 | this.Visible = true; 318 | this.WindowState = System.Windows.Forms.FormWindowState.Normal; 319 | this.ShowInTaskbar = true; 320 | } 321 | 322 | private void settingsToolStripMenuItem_Click(object sender, EventArgs e) 323 | { 324 | openSettings(); 325 | } 326 | 327 | private void notifyIcon1_DoubleClick(object sender, EventArgs e) 328 | { 329 | openSettings(); 330 | } 331 | 332 | private void upButton_Click(object sender, EventArgs e) 333 | { 334 | try 335 | { 336 | if (listView1.SelectedItems.Count > 0) 337 | { 338 | ListViewItem selected = listView1.SelectedItems[0]; 339 | int indx = selected.Index; 340 | int totl = listView1.Items.Count; 341 | 342 | if (indx == 0) 343 | { 344 | listView1.Items.Remove(selected); 345 | listView1.Items.Insert(totl - 1, selected); 346 | } 347 | else 348 | { 349 | listView1.Items.Remove(selected); 350 | listView1.Items.Insert(indx - 1, selected); 351 | } 352 | } 353 | else 354 | { 355 | MessageBox.Show("You can only move one item at a time. Please select only one item and try again.", 356 | "Item Select", MessageBoxButtons.OK, MessageBoxIcon.Stop); 357 | } 358 | } 359 | catch (Exception ex) 360 | { 361 | 362 | } 363 | } 364 | 365 | private void downButton_Click(object sender, EventArgs e) 366 | { 367 | try 368 | { 369 | if (listView1.SelectedItems.Count > 0) 370 | { 371 | ListViewItem selected = listView1.SelectedItems[0]; 372 | int indx = selected.Index; 373 | int totl = listView1.Items.Count; 374 | 375 | if (indx == totl - 1) 376 | { 377 | listView1.Items.Remove(selected); 378 | listView1.Items.Insert(0, selected); 379 | } 380 | else 381 | { 382 | listView1.Items.Remove(selected); 383 | listView1.Items.Insert(indx + 1, selected); 384 | } 385 | } 386 | else 387 | { 388 | MessageBox.Show("You can only move one item at a time. Please select only one item and try again.", 389 | "Item Select", MessageBoxButtons.OK, MessageBoxIcon.Stop); 390 | } 391 | } 392 | catch (Exception ex) 393 | { 394 | } 395 | } 396 | 397 | private void saveButton_Click(object sender, EventArgs e) 398 | { 399 | _rightHotkey.Unregister(Key.Right, System.Windows.Input.ModifierKeys.Control | System.Windows.Input.ModifierKeys.Alt); 400 | _leftHotkey.Unregister(Key.Left, System.Windows.Input.ModifierKeys.Control | System.Windows.Input.ModifierKeys.Alt); 401 | _rightHotkey.Unregister(Key.Right, System.Windows.Input.ModifierKeys.Shift | System.Windows.Input.ModifierKeys.Alt); 402 | _leftHotkey.Unregister(Key.Left, System.Windows.Input.ModifierKeys.Shift | System.Windows.Input.ModifierKeys.Alt); 403 | 404 | if (checkBox1.Checked) 405 | { 406 | alternateHotkeys(); 407 | Properties.Settings.Default.AltHotKey = true; 408 | } 409 | else 410 | { 411 | normalHotkeys(); 412 | Properties.Settings.Default.AltHotKey = false; 413 | } 414 | 415 | Properties.Settings.Default.DesktopBackgroundFiles.Clear(); 416 | foreach (ListViewItem item in listView1.Items) 417 | { 418 | Properties.Settings.Default.DesktopBackgroundFiles.Add(item.Tag.ToString()); 419 | } 420 | 421 | Properties.Settings.Default.Save(); 422 | labelStatus.Text = "Changes were successful."; 423 | } 424 | 425 | private void addFileButton_Click(object sender, EventArgs e) 426 | { 427 | openFileDialog1.CheckFileExists = true; 428 | openFileDialog1.CheckPathExists = true; 429 | openFileDialog1.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All files (*.*)|*.*"; 430 | openFileDialog1.FilterIndex = 0; 431 | openFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); 432 | openFileDialog1.Multiselect = true; 433 | openFileDialog1.Title = "Select desktop background image"; 434 | if (openFileDialog1.ShowDialog(this) == DialogResult.OK) 435 | { 436 | foreach (string file in openFileDialog1.FileNames) 437 | { 438 | listView1.Items.Add(NewListViewItem(file)); 439 | } 440 | } 441 | } 442 | 443 | private static ListViewItem NewListViewItem(string file) 444 | { 445 | return new ListViewItem() 446 | { 447 | Text = Path.GetFileName(file), 448 | ToolTipText = file, 449 | Name = Path.GetFileName(file), 450 | Tag = file 451 | }; 452 | } 453 | 454 | private void removeButton_Click(object sender, EventArgs e) 455 | { 456 | try 457 | { 458 | if (listView1.SelectedItems.Count > 0) 459 | { 460 | ListViewItem selected = listView1.SelectedItems[0]; 461 | listView1.Items.Remove(selected); 462 | } 463 | } 464 | catch (Exception ex) 465 | { 466 | } 467 | } 468 | } 469 | } 470 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Form1.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | 124 | 191, 17 125 | 126 | 127 | 346, 17 128 | 129 | 130 | 131 | 132 | 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 241 | rkJggg== 242 | 243 | 244 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Native.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Runtime.InteropServices; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace VirtualDesktopManager 9 | { 10 | internal static class Native 11 | { 12 | [DllImport("user32.dll", CharSet = CharSet.Auto)] 13 | internal static extern int SystemParametersInfo( 14 | uint uAction, 15 | uint uParam, 16 | string lpvParam, 17 | uint fuWinIni); 18 | 19 | public static void SetBackground(string pictureFile) 20 | { 21 | const uint SPI_SETDESKWALLPAPER = 0x0014; 22 | const uint SPIF_UPDATEINIFILE = 1; 23 | const uint SPIF_SENDWININICHANGE = 2; 24 | 25 | SystemParametersInfo( 26 | SPI_SETDESKWALLPAPER, 27 | 0, 28 | pictureFile, 29 | SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace VirtualDesktopManager 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// The main entry point for the application. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new Form1()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("VirtualDestopCycle")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("VirtualDestopCycle")] 13 | [assembly: AssemblyCopyright("Copyright © 2016")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("065f69ee-7316-4cb0-97a0-224cc1045c37")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace VirtualDesktopManager.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VirtualDesktopManager.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 65 | /// 66 | internal static System.Drawing.Icon _1 { 67 | get { 68 | object obj = ResourceManager.GetObject("_1", resourceCulture); 69 | return ((System.Drawing.Icon)(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 75 | /// 76 | internal static System.Drawing.Icon _2 { 77 | get { 78 | object obj = ResourceManager.GetObject("_2", resourceCulture); 79 | return ((System.Drawing.Icon)(obj)); 80 | } 81 | } 82 | 83 | /// 84 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 85 | /// 86 | internal static System.Drawing.Icon _3 { 87 | get { 88 | object obj = ResourceManager.GetObject("_3", resourceCulture); 89 | return ((System.Drawing.Icon)(obj)); 90 | } 91 | } 92 | 93 | /// 94 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 95 | /// 96 | internal static System.Drawing.Icon _4 { 97 | get { 98 | object obj = ResourceManager.GetObject("_4", resourceCulture); 99 | return ((System.Drawing.Icon)(obj)); 100 | } 101 | } 102 | 103 | /// 104 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 105 | /// 106 | internal static System.Drawing.Icon _5 { 107 | get { 108 | object obj = ResourceManager.GetObject("_5", resourceCulture); 109 | return ((System.Drawing.Icon)(obj)); 110 | } 111 | } 112 | 113 | /// 114 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 115 | /// 116 | internal static System.Drawing.Icon _6 { 117 | get { 118 | object obj = ResourceManager.GetObject("_6", resourceCulture); 119 | return ((System.Drawing.Icon)(obj)); 120 | } 121 | } 122 | 123 | /// 124 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 125 | /// 126 | internal static System.Drawing.Icon _7 { 127 | get { 128 | object obj = ResourceManager.GetObject("_7", resourceCulture); 129 | return ((System.Drawing.Icon)(obj)); 130 | } 131 | } 132 | 133 | /// 134 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 135 | /// 136 | internal static System.Drawing.Icon _8 { 137 | get { 138 | object obj = ResourceManager.GetObject("_8", resourceCulture); 139 | return ((System.Drawing.Icon)(obj)); 140 | } 141 | } 142 | 143 | /// 144 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 145 | /// 146 | internal static System.Drawing.Icon _9 { 147 | get { 148 | object obj = ResourceManager.GetObject("_9", resourceCulture); 149 | return ((System.Drawing.Icon)(obj)); 150 | } 151 | } 152 | 153 | /// 154 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 155 | /// 156 | internal static System.Drawing.Icon mainIco { 157 | get { 158 | object obj = ResourceManager.GetObject("mainIco", resourceCulture); 159 | return ((System.Drawing.Icon)(obj)); 160 | } 161 | } 162 | 163 | /// 164 | /// Looks up a localized resource of type System.Drawing.Bitmap. 165 | /// 166 | internal static System.Drawing.Bitmap mainIcoPng { 167 | get { 168 | object obj = ResourceManager.GetObject("mainIcoPng", resourceCulture); 169 | return ((System.Drawing.Bitmap)(obj)); 170 | } 171 | } 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\resources\mainico.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 123 | 124 | 125 | ..\Resources\mainIco.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 126 | 127 | 128 | ..\Resources\1.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 129 | 130 | 131 | ..\Resources\2.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 132 | 133 | 134 | ..\Resources\3.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 135 | 136 | 137 | ..\Resources\4.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 138 | 139 | 140 | ..\Resources\5.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 141 | 142 | 143 | ..\Resources\6.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 144 | 145 | 146 | ..\Resources\7.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 147 | 148 | 149 | ..\Resources\8.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 150 | 151 | 152 | ..\Resources\9.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 153 | 154 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace VirtualDesktopManager.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.UserScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 29 | [global::System.Configuration.SettingsManageability(System.Configuration.SettingsManageability.Roaming)] 30 | public bool AltHotKey { 31 | get { 32 | return ((bool)(this["AltHotKey"])); 33 | } 34 | set { 35 | this["AltHotKey"] = value; 36 | } 37 | } 38 | 39 | [global::System.Configuration.UserScopedSettingAttribute()] 40 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 41 | [global::System.Configuration.DefaultSettingValueAttribute("\r\n")] 43 | [global::System.Configuration.SettingsManageability(System.Configuration.SettingsManageability.Roaming)] 44 | public global::System.Collections.Specialized.StringCollection DesktopBackgroundFiles { 45 | get { 46 | return ((global::System.Collections.Specialized.StringCollection)(this["DesktopBackgroundFiles"])); 47 | } 48 | set { 49 | this["DesktopBackgroundFiles"] = value; 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | False 7 | 8 | 9 | <?xml version="1.0" encoding="utf-16"?> 10 | <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 11 | 12 | 13 | -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/1.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/2.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/2.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/3.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/3.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/4.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/4.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/5.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/5.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/6.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/6.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/7.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/7.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/8.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/8.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/9.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/9.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/9plus.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/9plus.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/mainIco.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/mainIco.ico -------------------------------------------------------------------------------- /VirtualDestopCycle/Resources/mainIco.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m0ngr31/VirtualDesktopManager/1b241dc07273d88ea0bd69e8861dd8a9ec3e7004/VirtualDestopCycle/Resources/mainIco.png -------------------------------------------------------------------------------- /VirtualDestopCycle/VirtualDesktopManager.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {065F69EE-7316-4CB0-97A0-224CC1045C37} 8 | WinExe 9 | Properties 10 | VirtualDesktopManager 11 | VirtualDesktopManager 12 | v4.6 13 | 512 14 | true 15 | 16 | false 17 | publish\ 18 | true 19 | Disk 20 | false 21 | Foreground 22 | 7 23 | Days 24 | false 25 | false 26 | true 27 | 0 28 | 1.0.0.%2a 29 | false 30 | true 31 | 32 | 33 | AnyCPU 34 | true 35 | full 36 | false 37 | bin\Debug\ 38 | DEBUG;TRACE 39 | prompt 40 | 4 41 | 42 | 43 | AnyCPU 44 | pdbonly 45 | false 46 | bin\Release\ 47 | TRACE 48 | prompt 49 | 4 50 | 51 | 52 | 53 | true 54 | bin\x64\Debug\ 55 | 56 | 57 | full 58 | x64 59 | prompt 60 | MinimumRecommendedRules.ruleset 61 | true 62 | 63 | 64 | bin\x64\Release\ 65 | TRACE 66 | true 67 | pdbonly 68 | x64 69 | prompt 70 | MinimumRecommendedRules.ruleset 71 | true 72 | 73 | 74 | Resources\mainIco.ico 75 | 76 | 77 | 78 | 79 | app.manifest 80 | 81 | 82 | 83 | ..\packages\GlobalHotKey.1.1.0\lib\GlobalHotKey.dll 84 | True 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | ..\packages\VirtualDesktop.2.0.0-beta3\lib\net46\VirtualDesktop.dll 99 | True 100 | 101 | 102 | 103 | 104 | 105 | Form 106 | 107 | 108 | Form1.cs 109 | 110 | 111 | 112 | 113 | 114 | Form1.cs 115 | 116 | 117 | ResXFileCodeGenerator 118 | Resources.Designer.cs 119 | Designer 120 | 121 | 122 | True 123 | Resources.resx 124 | True 125 | 126 | 127 | Designer 128 | 129 | 130 | 131 | SettingsSingleFileGenerator 132 | Settings.Designer.cs 133 | 134 | 135 | True 136 | Settings.settings 137 | True 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | False 180 | Microsoft .NET Framework 4.6 %28x86 and x64%29 181 | true 182 | 183 | 184 | False 185 | .NET Framework 3.5 SP1 186 | false 187 | 188 | 189 | 190 | 197 | -------------------------------------------------------------------------------- /VirtualDestopCycle/app.manifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 52 | 53 | 54 | true 55 | 56 | 57 | 58 | 59 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /VirtualDestopCycle/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | --------------------------------------------------------------------------------