├── .gitignore
├── LICENSE
├── README.md
└── Remote-Controller-Desktop
├── RemoteControllerDesktop.sln
└── RemoteControllerDesktop
├── App.config
├── App.xaml
├── App.xaml.cs
├── BaseCommand.cs
├── Fonts
├── Roboto-Medium.ttf
└── Roboto-Regular.ttf
├── MainWindow.xaml
├── MainWindow.xaml.cs
├── Properties
├── AssemblyInfo.cs
├── Resources.Designer.cs
├── Resources.resx
├── Settings.Designer.cs
└── Settings.settings
├── RemoteControllerDesktop.csproj
├── Resources
└── ic_logo_transparent.png
├── app_icon.ico
├── app_logo.png
├── app_logo_transparent.png
├── ic_dialog_alert_holo_light.png
├── ic_vpn_key_black_24dp.png
├── ic_wifi_black_24dp.png
└── packages.config
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.suo
8 | *.user
9 | *.userosscache
10 | *.sln.docstates
11 |
12 | # User-specific files (MonoDevelop/Xamarin Studio)
13 | *.userprefs
14 |
15 | # Build results
16 | [Dd]ebug/
17 | [Dd]ebugPublic/
18 | [Rr]elease/
19 | [Rr]eleases/
20 | x64/
21 | x86/
22 | bld/
23 | [Bb]in/
24 | [Oo]bj/
25 | [Ll]og/
26 |
27 | # Visual Studio 2015 cache/options directory
28 | .vs/
29 | # Uncomment if you have tasks that create the project's static files in wwwroot
30 | #wwwroot/
31 |
32 | # MSTest test Results
33 | [Tt]est[Rr]esult*/
34 | [Bb]uild[Ll]og.*
35 |
36 | # NUNIT
37 | *.VisualState.xml
38 | TestResult.xml
39 |
40 | # Build Results of an ATL Project
41 | [Dd]ebugPS/
42 | [Rr]eleasePS/
43 | dlldata.c
44 |
45 | # .NET Core
46 | project.lock.json
47 | project.fragment.lock.json
48 | artifacts/
49 | **/Properties/launchSettings.json
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 | *.VC.db
88 | *.VC.VC.opendb
89 |
90 | # Visual Studio profiler
91 | *.psess
92 | *.vsp
93 | *.vspx
94 | *.sap
95 |
96 | # TFS 2012 Local Workspace
97 | $tf/
98 |
99 | # Guidance Automation Toolkit
100 | *.gpState
101 |
102 | # ReSharper is a .NET coding add-in
103 | _ReSharper*/
104 | *.[Rr]e[Ss]harper
105 | *.DotSettings.user
106 |
107 | # JustCode is a .NET coding add-in
108 | .JustCode
109 |
110 | # TeamCity is a build add-in
111 | _TeamCity*
112 |
113 | # DotCover is a Code Coverage Tool
114 | *.dotCover
115 |
116 | # Visual Studio code coverage results
117 | *.coverage
118 | *.coveragexml
119 |
120 | # NCrunch
121 | _NCrunch_*
122 | .*crunch*.local.xml
123 | nCrunchTemp_*
124 |
125 | # MightyMoose
126 | *.mm.*
127 | AutoTest.Net/
128 |
129 | # Web workbench (sass)
130 | .sass-cache/
131 |
132 | # Installshield output folder
133 | [Ee]xpress/
134 |
135 | # DocProject is a documentation generator add-in
136 | DocProject/buildhelp/
137 | DocProject/Help/*.HxT
138 | DocProject/Help/*.HxC
139 | DocProject/Help/*.hhc
140 | DocProject/Help/*.hhk
141 | DocProject/Help/*.hhp
142 | DocProject/Help/Html2
143 | DocProject/Help/html
144 |
145 | # Click-Once directory
146 | publish/
147 |
148 | # Publish Web Output
149 | *.[Pp]ublish.xml
150 | *.azurePubxml
151 | # TODO: Comment the next line if you want to checkin your web deploy settings
152 | # but database connection strings (with potential passwords) will be unencrypted
153 | *.pubxml
154 | *.publishproj
155 |
156 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
157 | # checkin your Azure Web App publish settings, but sensitive information contained
158 | # in these scripts will be unencrypted
159 | PublishScripts/
160 |
161 | # NuGet Packages
162 | *.nupkg
163 | # The packages folder can be ignored because of Package Restore
164 | **/packages/*
165 | # except build/, which is used as an MSBuild target.
166 | !**/packages/build/
167 | # Uncomment if necessary however generally it will be regenerated when needed
168 | #!**/packages/repositories.config
169 | # NuGet v3's project.json files produces more ignorable files
170 | *.nuget.props
171 | *.nuget.targets
172 |
173 | # Microsoft Azure Build Output
174 | csx/
175 | *.build.csdef
176 |
177 | # Microsoft Azure Emulator
178 | ecf/
179 | rcf/
180 |
181 | # Windows Store app package directories and files
182 | AppPackages/
183 | BundleArtifacts/
184 | Package.StoreAssociation.xml
185 | _pkginfo.txt
186 |
187 | # Visual Studio cache files
188 | # files ending in .cache can be ignored
189 | *.[Cc]ache
190 | # but keep track of directories ending in .cache
191 | !*.[Cc]ache/
192 |
193 | # Others
194 | ClientBin/
195 | ~$*
196 | *~
197 | *.dbmdl
198 | *.dbproj.schemaview
199 | *.jfm
200 | *.pfx
201 | *.publishsettings
202 | orleans.codegen.cs
203 |
204 | # Since there are multiple workflows, uncomment next line to ignore bower_components
205 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
206 | #bower_components/
207 |
208 | # RIA/Silverlight projects
209 | Generated_Code/
210 |
211 | # Backup & report files from converting an old project file
212 | # to a newer Visual Studio version. Backup files are not needed,
213 | # because we have git ;-)
214 | _UpgradeReport_Files/
215 | Backup*/
216 | UpgradeLog*.XML
217 | UpgradeLog*.htm
218 |
219 | # SQL Server files
220 | *.mdf
221 | *.ldf
222 | *.ndf
223 |
224 | # Business Intelligence projects
225 | *.rdl.data
226 | *.bim.layout
227 | *.bim_*.settings
228 |
229 | # Microsoft Fakes
230 | FakesAssemblies/
231 |
232 | # GhostDoc plugin setting file
233 | *.GhostDoc.xml
234 |
235 | # Node.js Tools for Visual Studio
236 | .ntvs_analysis.dat
237 | node_modules/
238 |
239 | # Typescript v1 declaration files
240 | typings/
241 |
242 | # Visual Studio 6 build log
243 | *.plg
244 |
245 | # Visual Studio 6 workspace options file
246 | *.opt
247 |
248 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
249 | *.vbw
250 |
251 | # Visual Studio LightSwitch build output
252 | **/*.HTMLClient/GeneratedArtifacts
253 | **/*.DesktopClient/GeneratedArtifacts
254 | **/*.DesktopClient/ModelManifest.xml
255 | **/*.Server/GeneratedArtifacts
256 | **/*.Server/ModelManifest.xml
257 | _Pvt_Extensions
258 |
259 | # Paket dependency manager
260 | .paket/paket.exe
261 | paket-files/
262 |
263 | # FAKE - F# Make
264 | .fake/
265 |
266 | # JetBrains Rider
267 | .idea/
268 | *.sln.iml
269 |
270 | # CodeRush
271 | .cr/
272 |
273 | # Python Tools for Visual Studio (PTVS)
274 | __pycache__/
275 | *.pyc
276 |
277 | # Cake - Uncomment if you are using it
278 | # tools/**
279 | # !tools/packages.config
280 |
281 | # Telerik's JustMock configuration file
282 | *.jmconfig
283 |
284 | # BizTalk build output
285 | *.btp.cs
286 | *.btm.cs
287 | *.odx.cs
288 | *.xsd.cs
289 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Remote-Controller-Windows
2 | Mouse and Keyboard emulating Remote Controller Windows desktop app which compiled with WPF.
3 |
4 | It works with own Android app namely Remote-Controller-Android.
5 |
6 | Developed with MahApps.Metro (http://mahapps.com), QRCoder (https://github.com/codebude/QRCoder) and Newtonsoft.Json (https://www.newtonsoft.com/json).
7 |
8 | Android application coming soon.
9 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.26430.14
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteControllerDesktop", "RemoteControllerDesktop\RemoteControllerDesktop.csproj", "{C73696A6-728B-4626-B08E-84246C6BA295}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {C73696A6-728B-4626-B08E-84246C6BA295}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {C73696A6-728B-4626-B08E-84246C6BA295}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {C73696A6-728B-4626-B08E-84246C6BA295}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {C73696A6-728B-4626-B08E-84246C6BA295}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | EndGlobal
23 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/App.xaml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 |
4 | namespace RemoteController.Desktop
5 | {
6 | public partial class App : Application
7 | {
8 | static System.Windows.Forms.NotifyIcon NOTIFY_ICON = null;
9 |
10 | public static void ShowNotifyIcon(System.Drawing.Icon icon, string balloonTip)
11 | {
12 | if (NOTIFY_ICON == null)
13 | InitializeNotifyIcon();
14 |
15 | NOTIFY_ICON.BalloonTipText = balloonTip;
16 | NOTIFY_ICON.Icon = icon;
17 | NOTIFY_ICON.Visible = true;
18 | NOTIFY_ICON.ShowBalloonTip(500);
19 | }
20 |
21 | public static void HideNotifyIcon()
22 | {
23 | if (NOTIFY_ICON == null)
24 | return;
25 |
26 | NOTIFY_ICON.Visible = false;
27 | NOTIFY_ICON.Dispose();
28 | NOTIFY_ICON = null;
29 | }
30 |
31 | static void InitializeNotifyIcon()
32 | {
33 | NOTIFY_ICON = new System.Windows.Forms.NotifyIcon();
34 | NOTIFY_ICON.Visible = false;
35 | NOTIFY_ICON.Text = "Remote Controller Desktop";
36 | NOTIFY_ICON.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
37 | NOTIFY_ICON.BalloonTipTitle = "Remote Controller Desktop";
38 | NOTIFY_ICON.DoubleClick += NotifyIcon_DoubleClick;
39 |
40 | NOTIFY_ICON.ContextMenu = new System.Windows.Forms.ContextMenu();
41 | System.Windows.Forms.MenuItem notifyIconMenuTitle = new System.Windows.Forms.MenuItem("Remote Controller Desktop");
42 | notifyIconMenuTitle.Enabled = false;
43 | System.Windows.Forms.MenuItem notifyIconMenuShow = new System.Windows.Forms.MenuItem("Show");
44 | System.Windows.Forms.MenuItem notifyIconMenuExit = new System.Windows.Forms.MenuItem("Exit");
45 | notifyIconMenuShow.Click += NotifyIconMenu_Click;
46 | notifyIconMenuExit.Click += NotifyIconMenu_Click;
47 | NOTIFY_ICON.ContextMenu.MenuItems.Add(notifyIconMenuTitle);
48 | NOTIFY_ICON.ContextMenu.MenuItems.Add("-");
49 | NOTIFY_ICON.ContextMenu.MenuItems.Add(notifyIconMenuShow);
50 | NOTIFY_ICON.ContextMenu.MenuItems.Add(notifyIconMenuExit);
51 | }
52 |
53 | static void NotifyIcon_DoubleClick(object sender, EventArgs e)
54 | {
55 | App.Current.MainWindow.Show();
56 | HideNotifyIcon();
57 | }
58 |
59 | static void NotifyIconMenu_Click(object sender, EventArgs e)
60 | {
61 | System.Windows.Forms.MenuItem menuItem = sender as System.Windows.Forms.MenuItem;
62 | if (menuItem.Text.Equals("Show"))
63 | {
64 | App.Current.MainWindow.Show();
65 | HideNotifyIcon();
66 | }
67 | else if (menuItem.Text.Equals("Exit"))
68 | App.Current.Shutdown();
69 | }
70 |
71 | private void Application_Exit(object sender, ExitEventArgs e)
72 | {
73 | HideNotifyIcon();
74 | }
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/BaseCommand.cs:
--------------------------------------------------------------------------------
1 | using Newtonsoft.Json.Linq;
2 | using System;
3 | using System.Security.Authentication;
4 |
5 | namespace RemoteController.Desktop
6 | {
7 | public class BaseAction
8 | {
9 | public ActionType action { get; internal set; }
10 |
11 | public BaseAction(JObject jsonObject)
12 | {
13 | string actionString = jsonObject["Action"].ToString();
14 |
15 | ActionType tempAction;
16 | if (!Enum.TryParse(actionString, out tempAction))
17 | throw new InvalidCastException();
18 |
19 | this.action = tempAction;
20 | }
21 |
22 | public enum ActionType
23 | {
24 | Hello,
25 | Authenticate,
26 | Goodbye,
27 | ScreenRecognize,
28 | Clipboard,
29 | Text,
30 | MouseMove,
31 | MouseMoveRelative,
32 | MouseDown,
33 | MouseUp,
34 | MouseClick,
35 | MouseDrag,
36 | MouseDragRelative,
37 | Scroll,
38 | VolumeUp,
39 | VolumeDown,
40 | VolumeMute,
41 | MediaPlayPause,
42 | MediaStop,
43 | MediaNextTrack,
44 | MediaPrevTrack,
45 | MediaFastForward,
46 | MediaFastRewind
47 | }
48 |
49 | public enum MouseButtonType
50 | {
51 | Left,
52 | Right
53 | }
54 |
55 | public enum ScrollDirectionType
56 | {
57 | Vertical,
58 | Horizontal
59 | }
60 | }
61 |
62 | public class AuthBaseAction : BaseAction
63 | {
64 | public string secret { get; internal set; }
65 |
66 | public AuthBaseAction(JObject obj, bool checkSecret) : base(obj)
67 | {
68 | this.secret = obj["Secret"].ToString();
69 | if (!this.secret.Equals(MainWindow.CurrentToken))
70 | throw new AuthenticationException();
71 | }
72 | }
73 |
74 | public class HelloCommand : BaseAction
75 | {
76 | public string pin { get; internal set; }
77 |
78 | public HelloCommand(JObject obj) : base(obj)
79 | {
80 | this.pin = obj["PIN"].ToString();
81 | }
82 | }
83 |
84 | public class ScreenRecognizeCommand : AuthBaseAction
85 | {
86 | public int remoteScreenX { get; internal set; }
87 | public int remoteScreenY { get; internal set; }
88 |
89 | public ScreenRecognizeCommand(JObject obj) : base(obj, true)
90 | {
91 | this.remoteScreenX = obj["X"].ToObject();
92 | this.remoteScreenY = obj["Y"].ToObject();
93 | }
94 | }
95 |
96 | public class ClipboardCommand : AuthBaseAction
97 | {
98 | public string data { get; internal set; }
99 |
100 | public ClipboardCommand(JObject obj) : base(obj, true)
101 | {
102 | this.data = obj["Data"].ToString();
103 | }
104 | }
105 |
106 | public class TextCommand : AuthBaseAction
107 | {
108 | public string data { get; internal set; }
109 |
110 | public TextCommand(JObject obj) : base(obj, true)
111 | {
112 | this.data = obj["Data"].ToString();
113 | }
114 | }
115 |
116 | public class MouseMoveCommand : AuthBaseAction
117 | {
118 | public int x { get; internal set; }
119 | public int y { get; internal set; }
120 |
121 | public MouseMoveCommand(JObject obj) : base(obj, true)
122 | {
123 | this.x = obj["X"].ToObject();
124 | this.y = obj["Y"].ToObject();
125 | }
126 | }
127 |
128 | public class MouseClickCommand : AuthBaseAction
129 | {
130 | public MouseButtonType button { get; internal set; }
131 |
132 | public MouseClickCommand(JObject obj) : base(obj, true)
133 | {
134 | string buttonString = obj["Button"].ToString();
135 |
136 | MouseButtonType tempButtonType;
137 | if (!Enum.TryParse(buttonString, out tempButtonType))
138 | throw new InvalidCastException();
139 |
140 | this.button = tempButtonType;
141 | }
142 | }
143 |
144 | public class MouseDragCommand : AuthBaseAction
145 | {
146 | public int x { get; internal set; }
147 | public int y { get; internal set; }
148 | public MouseButtonType button { get; set; }
149 |
150 | public MouseDragCommand(JObject obj) : base(obj, true)
151 | {
152 | this.x = obj["X"].ToObject();
153 | this.y = obj["Y"].ToObject();
154 |
155 | string buttonString = obj["Button"].ToString();
156 |
157 | MouseButtonType tempButton;
158 | if (!Enum.TryParse(buttonString, out tempButton))
159 | throw new InvalidCastException();
160 |
161 | this.button = tempButton;
162 | }
163 | }
164 |
165 | public class ScrollCommand : AuthBaseAction
166 | {
167 | public int amount { get; internal set; }
168 | public ScrollDirectionType direction { get; set; }
169 |
170 | public ScrollCommand(JObject obj) : base(obj, true)
171 | {
172 | this.amount = obj["Amount"].ToObject();
173 |
174 | string directionString = obj["Direction"].ToString();
175 |
176 | ScrollDirectionType tempDirection;
177 | if (!Enum.TryParse(directionString, out tempDirection))
178 | throw new InvalidCastException();
179 |
180 | this.direction = tempDirection;
181 | }
182 | }
183 | }
184 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/Fonts/Roboto-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tunaemre/Remote-Controller-Windows/2c3ec910660be488875b1a2409c7d18993dff6c3/Remote-Controller-Desktop/RemoteControllerDesktop/Fonts/Roboto-Medium.ttf
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/Fonts/Roboto-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tunaemre/Remote-Controller-Windows/2c3ec910660be488875b1a2409c7d18993dff6c3/Remote-Controller-Desktop/RemoteControllerDesktop/Fonts/Roboto-Regular.ttf
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/MainWindow.xaml:
--------------------------------------------------------------------------------
1 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/MainWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using MahApps.Metro.Controls;
2 | using MahApps.Metro.Controls.Dialogs;
3 | using Newtonsoft.Json.Linq;
4 | using QRCoder;
5 | using System;
6 | using System.Drawing;
7 | using System.IO;
8 | using System.Net;
9 | using System.Net.NetworkInformation;
10 | using System.Net.Sockets;
11 | using System.Runtime.InteropServices;
12 | using System.Text;
13 | using System.Threading.Tasks;
14 | using System.Windows.Media.Imaging;
15 |
16 | namespace RemoteController.Desktop
17 | {
18 | public partial class MainWindow : MetroWindow
19 | {
20 | [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
21 | public static extern void mouse_event(uint dwFlags, int dx, int dy, uint cButtons, uint dwExtraInfo);
22 |
23 | [DllImport("user32.dll")]
24 | public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
25 |
26 | [DllImport("user32.dll")]
27 | static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
28 |
29 | private const int MOUSEEVENTF_LEFTDOWN = 0x02;
30 | private const int MOUSEEVENTF_LEFTUP = 0x04;
31 | private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
32 | private const int MOUSEEVENTF_RIGHTUP = 0x10;
33 | private const int MOUSEEVENTF_WHEEL = 0x0800;
34 | private const int MOUSEEVENTF_HWHEEL = 0x01000;
35 |
36 | protected string LocalIP
37 | {
38 | get
39 | {
40 | NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
41 | foreach (NetworkInterface adapter in networkInterfaces)
42 | {
43 | if (adapter.OperationalStatus == OperationalStatus.Up)
44 | {
45 | IPInterfaceProperties properties = adapter.GetIPProperties();
46 | foreach (var ip in properties.UnicastAddresses)
47 | {
48 | if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
49 | return ip.Address.ToString();
50 | }
51 | }
52 | }
53 |
54 | return null;
55 | }
56 | }
57 |
58 | protected string PIN
59 | {
60 | get
61 | {
62 | return new Random().Next(0, 9999).ToString("0000");
63 | }
64 | }
65 |
66 | protected string Token
67 | {
68 | get
69 | {
70 | return Guid.NewGuid().ToString();
71 | }
72 | }
73 |
74 | static string LocalhostIP = "127.0.0.1";
75 | static string CurrentIP = null;
76 | static string CurrentPIN = null;
77 | public static string CurrentToken = null;
78 |
79 | static int Port = 13000;
80 |
81 | static float ScaleXFactor = 1f;
82 | static float ScaleYFactor = 1f;
83 |
84 | bool MouseButtonPressing = false;
85 | int PressingMouseButtonID = 0;
86 |
87 | Point CapturedMouseLocation;
88 |
89 | ProgressDialogController Progress;
90 |
91 | public MainWindow()
92 | {
93 | InitializeComponent();
94 |
95 | if (InitializeWindow().Result)
96 | {
97 | TcpListener initialTcpListener = new TcpListener(IPAddress.Any, Port);
98 | initialTcpListener.Start();
99 |
100 | initialTcpListener.BeginAcceptTcpClient(new AsyncCallback(AcceptTcpClientCallback), initialTcpListener);
101 | }
102 | }
103 |
104 | private async Task InitializeWindow()
105 | {
106 | CurrentIP = LocalIP;
107 | CurrentPIN = PIN;
108 | CurrentToken = Token;
109 |
110 | if (CurrentIP == null)
111 | {
112 | await this.ShowMessageAsync("Error", "Local IP Address cannot be retrieved.");
113 |
114 | this.LabelIP.Content = "IP: N/A";
115 | return false;
116 | }
117 |
118 | this.LabelIP.Content = "IP: " + CurrentIP;
119 | this.LabelPIN.Content = "PIN: " + CurrentPIN;
120 |
121 | this.ImageQRCode.Source = GenerateQRCode(CurrentIP, CurrentPIN);
122 |
123 | return true;
124 | }
125 |
126 | static BitmapImage GenerateQRCode(string ip, string pin)
127 | {
128 | JObject qrData = new JObject();
129 | qrData.Add("IP", ip);
130 | qrData.Add("PIN", pin);
131 | qrData.Add("Port", Port);
132 |
133 | QRCodeGenerator qrGenerator = new QRCodeGenerator();
134 | QRCodeData qrCodeData = qrGenerator.CreateQrCode(qrData.ToString(Newtonsoft.Json.Formatting.None), QRCodeGenerator.ECCLevel.Q);
135 |
136 | Bitmap qrCodeBitmap = new QRCode(qrCodeData).GetGraphic(7);
137 |
138 | return BitmapToImageSource(qrCodeBitmap);
139 | }
140 |
141 | static BitmapImage BitmapToImageSource(Bitmap bitmap)
142 | {
143 | using (MemoryStream memoryStream = new MemoryStream())
144 | {
145 | bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
146 | memoryStream.Position = 0;
147 |
148 | BitmapImage bitmapImage = new BitmapImage();
149 | bitmapImage.BeginInit();
150 | bitmapImage.StreamSource = memoryStream;
151 | bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
152 | bitmapImage.EndInit();
153 |
154 | bitmap.Dispose();
155 |
156 | return bitmapImage;
157 | }
158 | }
159 |
160 | async void AcceptTcpClientCallback(IAsyncResult ar)
161 | {
162 | TcpListener listener = (TcpListener)ar.AsyncState;
163 | TcpClient client = listener.EndAcceptTcpClient(ar);
164 |
165 | NetworkStream stream = client.GetStream();
166 | byte[] dataBytes = new byte[client.ReceiveBufferSize];
167 |
168 | int bytesRead = await stream.ReadAsync(dataBytes, 0, client.ReceiveBufferSize);
169 | string request = Encoding.ASCII.GetString(dataBytes, 0, bytesRead);
170 |
171 | try
172 | {
173 | JObject jsonObject = JObject.Parse(request);
174 | BaseAction baseAction = new BaseAction(jsonObject);
175 |
176 | if (baseAction.action == BaseAction.ActionType.Hello)
177 | {
178 | HelloCommand action = new HelloCommand(jsonObject);
179 | if (action.pin.Equals(CurrentPIN))
180 | {
181 | await Dispatcher.BeginInvoke((Action)(async() =>
182 | {
183 | Progress = await this.ShowProgressAsync("Please wait", "Authenticating...");
184 | }));
185 |
186 | JObject authData = new JObject();
187 | authData.Add("Result", true);
188 | authData.Add("Token", CurrentToken);
189 | byte[] authDataBytes = Encoding.UTF8.GetBytes(authData.ToString());
190 |
191 | lock (stream)
192 | {
193 | stream.Write(authDataBytes, 0, authDataBytes.Length);
194 | }
195 |
196 | if (this.Visibility == System.Windows.Visibility.Visible)
197 | await Dispatcher.BeginInvoke((Action)(() =>
198 | {
199 | App.ShowNotifyIcon(Properties.Resources.app_icon, "Connected.");
200 |
201 | this.Hide();
202 | }));
203 | }
204 | else
205 | {
206 | JObject authData = new JObject();
207 | authData.Add("Result", false);
208 | byte[] authDataBytes = Encoding.UTF8.GetBytes(authData.ToString());
209 |
210 | lock (stream)
211 | {
212 | stream.Write(authDataBytes, 0, authDataBytes.Length);
213 | }
214 | }
215 | }
216 |
217 | if (baseAction.action == BaseAction.ActionType.Authenticate)
218 | {
219 | AuthBaseAction action = new AuthBaseAction(jsonObject, false);
220 | if (action.secret.Equals(CurrentToken))
221 | {
222 | ProgressDialogController progress = await this.ShowProgressAsync("Please wait", "Authenticating...");
223 |
224 | JObject authData = new JObject();
225 | authData.Add("Result", true);
226 | authData.Add("Token", CurrentToken);
227 | byte[] authDataBytes = Encoding.UTF8.GetBytes(authData.ToString());
228 |
229 | lock (stream)
230 | {
231 | stream.Write(authDataBytes, 0, authDataBytes.Length);
232 | }
233 |
234 | await progress.CloseAsync();
235 |
236 | if (this.Visibility == System.Windows.Visibility.Visible)
237 | await Dispatcher.BeginInvoke((Action)(() =>
238 | {
239 | App.ShowNotifyIcon(Properties.Resources.app_icon, "Connected.");
240 |
241 | this.Hide();
242 | }));
243 | }
244 | else
245 | {
246 | JObject authData = new JObject();
247 | authData.Add("Result", false);
248 | byte[] authDataBytes = Encoding.UTF8.GetBytes(authData.ToString());
249 |
250 | lock (stream)
251 | {
252 | stream.Write(authDataBytes, 0, authDataBytes.Length);
253 | }
254 | }
255 | }
256 |
257 | if (baseAction.action == BaseAction.ActionType.Goodbye)
258 | {
259 | await Dispatcher.BeginInvoke((Action)(() =>
260 | {
261 | App.ShowNotifyIcon(Properties.Resources.app_icon, "Disconnected.");
262 | }));
263 | }
264 |
265 | if (baseAction.action == BaseAction.ActionType.ScreenRecognize)
266 | {
267 | ScreenRecognizeCommand action = new ScreenRecognizeCommand(jsonObject);
268 |
269 | int primaryScreenX = (int)System.Windows.SystemParameters.PrimaryScreenWidth;
270 | int primaryScreenY = (int)System.Windows.SystemParameters.PrimaryScreenHeight;
271 |
272 | ScaleXFactor = (float)primaryScreenX / action.remoteScreenX;
273 | ScaleYFactor = (float)primaryScreenY / action.remoteScreenY;
274 | }
275 |
276 | if (baseAction.action == BaseAction.ActionType.Clipboard)
277 | {
278 | ClipboardCommand action = new ClipboardCommand(jsonObject);
279 | await Dispatcher.BeginInvoke((Action)(() =>
280 | {
281 | System.Windows.Clipboard.SetText(action.data);
282 | App.ShowNotifyIcon(Properties.Resources.app_icon, "Text copied to clipboard.");
283 | }));
284 | }
285 |
286 | if (baseAction.action == BaseAction.ActionType.Text)
287 | {
288 | ClipboardCommand action = new ClipboardCommand(jsonObject);
289 | System.Windows.Forms.SendKeys.SendWait(action.data);
290 | keybd_event((byte)System.Windows.Forms.Keys.Enter, 0, 0, 0);
291 | }
292 |
293 | if (baseAction.action == BaseAction.ActionType.MouseMove)
294 | {
295 | MouseMoveCommand action = new MouseMoveCommand(jsonObject);
296 | MouseButtonPressing = false;
297 | System.Windows.Forms.Cursor.Position = new Point((int)(action.x * ScaleXFactor),
298 | (int)(action.y * ScaleYFactor));
299 | }
300 |
301 | if (baseAction.action == BaseAction.ActionType.MouseMoveRelative)
302 | {
303 | MouseMoveCommand action = new MouseMoveCommand(jsonObject);
304 | MouseButtonPressing = false;
305 | System.Windows.Forms.Cursor.Position = new Point(System.Windows.Forms.Cursor.Position.X + (int)(action.x * ScaleXFactor),
306 | System.Windows.Forms.Cursor.Position.Y + (int)(action.y * ScaleYFactor));
307 | }
308 |
309 | if (baseAction.action == BaseAction.ActionType.MouseDown)
310 | {
311 | MouseClickCommand action = new MouseClickCommand(jsonObject);
312 | MouseButtonPressing = false;
313 | if (action.button == BaseAction.MouseButtonType.Left)
314 | mouse_event(MOUSEEVENTF_LEFTDOWN, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
315 | if (action.button == BaseAction.MouseButtonType.Right)
316 | mouse_event(MOUSEEVENTF_RIGHTDOWN, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
317 | }
318 |
319 | if (baseAction.action == BaseAction.ActionType.MouseUp)
320 | {
321 | MouseClickCommand action = new MouseClickCommand(jsonObject);
322 | MouseButtonPressing = false;
323 | if (action.button == BaseAction.MouseButtonType.Left)
324 | mouse_event(MOUSEEVENTF_LEFTUP, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
325 | if (action.button == BaseAction.MouseButtonType.Right)
326 | mouse_event(MOUSEEVENTF_RIGHTUP, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
327 | }
328 |
329 | if (baseAction.action == BaseAction.ActionType.MouseClick)
330 | {
331 | MouseClickCommand action = new MouseClickCommand(jsonObject);
332 | MouseButtonPressing = false;
333 | if (action.button == BaseAction.MouseButtonType.Left)
334 | mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
335 | if (action.button == BaseAction.MouseButtonType.Right)
336 | mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
337 | }
338 |
339 | if (baseAction.action == BaseAction.ActionType.MouseDrag)
340 | {
341 | MouseDragCommand action = new MouseDragCommand(jsonObject);
342 | System.Windows.Forms.Cursor.Position = new Point((int)(action.x * ScaleXFactor),
343 | (int)(action.y * ScaleYFactor));
344 |
345 | if (!MouseButtonPressing)
346 | {
347 | if (action.button == BaseAction.MouseButtonType.Left)
348 | {
349 | mouse_event(MOUSEEVENTF_LEFTDOWN, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
350 | PressingMouseButtonID = MOUSEEVENTF_LEFTDOWN;
351 | }
352 | if (action.button == BaseAction.MouseButtonType.Right)
353 | {
354 | mouse_event(MOUSEEVENTF_RIGHTDOWN, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
355 | PressingMouseButtonID = MOUSEEVENTF_RIGHTDOWN;
356 | }
357 | MouseButtonPressing = true;
358 | }
359 | }
360 |
361 | if (baseAction.action == BaseAction.ActionType.MouseDragRelative)
362 | {
363 | MouseDragCommand action = new MouseDragCommand(jsonObject);
364 | System.Windows.Forms.Cursor.Position = new Point(System.Windows.Forms.Cursor.Position.X + (int)(action.x * ScaleXFactor),
365 | System.Windows.Forms.Cursor.Position.Y + (int)(action.y * ScaleYFactor));
366 |
367 | if (!MouseButtonPressing)
368 | {
369 | if (action.button == BaseAction.MouseButtonType.Left)
370 | {
371 | mouse_event(MOUSEEVENTF_LEFTDOWN, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
372 | PressingMouseButtonID = MOUSEEVENTF_LEFTDOWN;
373 | }
374 | if (action.button == BaseAction.MouseButtonType.Right)
375 | {
376 | mouse_event(MOUSEEVENTF_RIGHTDOWN, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
377 | PressingMouseButtonID = MOUSEEVENTF_RIGHTDOWN;
378 | }
379 | MouseButtonPressing = true;
380 | }
381 | }
382 |
383 | if (baseAction.action == BaseAction.ActionType.Scroll)
384 | {
385 | ScrollCommand action = new ScrollCommand(jsonObject);
386 | if (action.direction == BaseAction.ScrollDirectionType.Vertical)
387 | mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (uint) action.amount, 0);
388 | if (action.direction == BaseAction.ScrollDirectionType.Horizontal)
389 | mouse_event(MOUSEEVENTF_HWHEEL, 0, 0, (uint)action.amount, 0);
390 | }
391 |
392 | if (baseAction.action == BaseAction.ActionType.VolumeUp)
393 | {
394 | keybd_event((byte)System.Windows.Forms.Keys.VolumeUp, 0, 0, 0);
395 | }
396 |
397 | if (baseAction.action == BaseAction.ActionType.VolumeDown)
398 | {
399 | keybd_event((byte)System.Windows.Forms.Keys.VolumeDown, 0, 0, 0);
400 | }
401 |
402 | if (baseAction.action == BaseAction.ActionType.VolumeMute)
403 | {
404 | keybd_event((byte)System.Windows.Forms.Keys.VolumeMute, 0, 0, 0);
405 | }
406 |
407 | if (baseAction.action == BaseAction.ActionType.MediaPlayPause)
408 | {
409 | keybd_event((byte)System.Windows.Forms.Keys.MediaPlayPause, 0, 0, 0);
410 | }
411 |
412 | if (baseAction.action == BaseAction.ActionType.MediaStop)
413 | {
414 | keybd_event((byte)System.Windows.Forms.Keys.MediaStop, 0, 0, 0);
415 | }
416 |
417 | if (baseAction.action == BaseAction.ActionType.MediaNextTrack)
418 | {
419 | keybd_event((byte)System.Windows.Forms.Keys.MediaNextTrack, 0, 0, 0);
420 | }
421 |
422 | if (baseAction.action == BaseAction.ActionType.MediaPrevTrack)
423 | {
424 | keybd_event((byte)System.Windows.Forms.Keys.MediaPreviousTrack, 0, 0, 0);
425 | }
426 |
427 | if (baseAction.action == BaseAction.ActionType.MediaFastForward)
428 | {
429 | keybd_event((byte)System.Windows.Forms.Keys.Right, 0, 0, 0);
430 | }
431 |
432 | if (baseAction.action == BaseAction.ActionType.MediaFastRewind)
433 | {
434 | keybd_event((byte)System.Windows.Forms.Keys.Left, 0, 0, 0);
435 | }
436 |
437 | if (!MouseButtonPressing && PressingMouseButtonID != 0)
438 | {
439 | if (PressingMouseButtonID == MOUSEEVENTF_LEFTDOWN)
440 | mouse_event(MOUSEEVENTF_LEFTUP, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
441 | if (PressingMouseButtonID == MOUSEEVENTF_RIGHTDOWN)
442 | mouse_event(MOUSEEVENTF_RIGHTUP, CapturedMouseLocation.X, CapturedMouseLocation.Y, 0, 0);
443 |
444 | PressingMouseButtonID = 0;
445 | }
446 | }
447 | catch (Exception e)
448 | {
449 |
450 | }
451 | finally
452 | {
453 | await Dispatcher.BeginInvoke((Action)(async () =>
454 | {
455 | if (Progress != null)
456 | {
457 | await Progress.CloseAsync();
458 | Progress = null;
459 | }
460 | }));
461 |
462 | stream.Close();
463 | client.Close();
464 | listener.BeginAcceptTcpClient(new AsyncCallback(AcceptTcpClientCallback), listener);
465 | }
466 | }
467 |
468 | private void LabelPINRefresh_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
469 | {
470 | CurrentPIN = PIN;
471 |
472 | this.LabelPIN.Content = "PIN: " + CurrentPIN;
473 | this.ImageQRCode.Source = GenerateQRCode(CurrentIP, CurrentPIN);
474 | }
475 |
476 | private async void ButtonInfo_Click(object sender, System.Windows.RoutedEventArgs e)
477 | {
478 | await this.ShowMessageAsync("Info", "Remote Controller Desktop\nDeveloped by Tuna Emre.\n\nhttps://github.com/tunaemre/Remote-Controller-Windows\n\nhttps://www.linkedin.com/in/tuna-emre");
479 | }
480 |
481 | private void MetroWindow_StateChanged(object sender, EventArgs e)
482 | {
483 | if (this.WindowState == System.Windows.WindowState.Minimized)
484 | {
485 | App.ShowNotifyIcon(Properties.Resources.app_icon, "Remote Controller Desktop still running.");
486 | this.Hide();
487 | }
488 | }
489 | }
490 | }
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Resources;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
5 | using System.Windows;
6 |
7 | // General Information about an assembly is controlled through the following
8 | // set of attributes. Change these attribute values to modify the information
9 | // associated with an assembly.
10 | [assembly: AssemblyTitle("Remote Controller")]
11 | [assembly: AssemblyDescription("")]
12 | [assembly: AssemblyConfiguration("")]
13 | [assembly: AssemblyCompany("")]
14 | [assembly: AssemblyProduct("RemoteController.Desktop")]
15 | [assembly: AssemblyCopyright("Tuna Emre")]
16 | [assembly: AssemblyTrademark("")]
17 | [assembly: AssemblyCulture("")]
18 |
19 | // Setting ComVisible to false makes the types in this assembly not visible
20 | // to COM components. If you need to access a type in this assembly from
21 | // COM, set the ComVisible attribute to true on that type.
22 | [assembly: ComVisible(false)]
23 |
24 | //In order to begin building localizable applications, set
25 | //CultureYouAreCodingWith in your .csproj file
26 | //inside a . For example, if you are using US english
27 | //in your source files, set the to en-US. Then uncomment
28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in
29 | //the line below to match the UICulture setting in the project file.
30 |
31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32 |
33 |
34 | [assembly: ThemeInfo(
35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
36 | //(used if a resource is not found in the page,
37 | // or application resource dictionaries)
38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
39 | //(used if a resource is not found in the page,
40 | // app, or any theme specific resource dictionaries)
41 | )]
42 |
43 |
44 | // Version information for an assembly consists of the following four values:
45 | //
46 | // Major Version
47 | // Minor Version
48 | // Build Number
49 | // Revision
50 | //
51 | // You can specify all the values or you can default the Build and Revision Numbers
52 | // by using the '*' as shown below:
53 | [assembly: AssemblyVersion("1.0.*")]
54 | [assembly: AssemblyFileVersion("1.0.0.0")]
55 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/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 RemoteController.Desktop.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("RemoteController.Desktop.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 app_icon {
67 | get {
68 | object obj = ResourceManager.GetObject("app_icon", resourceCulture);
69 | return ((System.Drawing.Icon)(obj));
70 | }
71 | }
72 |
73 | ///
74 | /// Looks up a localized resource of type System.Drawing.Bitmap.
75 | ///
76 | internal static System.Drawing.Bitmap app_logo {
77 | get {
78 | object obj = ResourceManager.GetObject("app_logo", resourceCulture);
79 | return ((System.Drawing.Bitmap)(obj));
80 | }
81 | }
82 |
83 | ///
84 | /// Looks up a localized resource of type System.Drawing.Bitmap.
85 | ///
86 | internal static System.Drawing.Bitmap ic_dialog_alert_holo_light {
87 | get {
88 | object obj = ResourceManager.GetObject("ic_dialog_alert_holo_light", resourceCulture);
89 | return ((System.Drawing.Bitmap)(obj));
90 | }
91 | }
92 |
93 | ///
94 | /// Looks up a localized resource of type System.Byte[].
95 | ///
96 | internal static byte[] Roboto_Medium {
97 | get {
98 | object obj = ResourceManager.GetObject("Roboto_Medium", resourceCulture);
99 | return ((byte[])(obj));
100 | }
101 | }
102 |
103 | ///
104 | /// Looks up a localized resource of type System.Byte[].
105 | ///
106 | internal static byte[] Roboto_Regular {
107 | get {
108 | object obj = ResourceManager.GetObject("Roboto_Regular", resourceCulture);
109 | return ((byte[])(obj));
110 | }
111 | }
112 | }
113 | }
114 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/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 | ..\app_icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
123 |
124 |
125 | ..\app_logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
126 |
127 |
128 | ..\ic_dialog_alert_holo_light.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
129 |
130 |
131 | ..\fonts\roboto-medium.ttf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
132 |
133 |
134 | ..\fonts\roboto-regular.ttf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
135 |
136 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/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 RemoteController.Desktop.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.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 | }
27 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/RemoteControllerDesktop.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {C73696A6-728B-4626-B08E-84246C6BA295}
8 | WinExe
9 | RemoteController.Desktop
10 | RemoteControllerDesktop
11 | v4.5.2
12 | 512
13 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
14 | 4
15 | true
16 | publish\
17 | true
18 | Disk
19 | false
20 | Foreground
21 | 7
22 | Days
23 | false
24 | false
25 | true
26 | 0
27 | 1.0.0.%2a
28 | false
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 | true
46 | bin\Release\
47 | TRACE
48 | prompt
49 | 4
50 |
51 |
52 | app_icon.ico
53 |
54 |
55 |
56 | ..\packages\MahApps.Metro.1.5.0\lib\net45\MahApps.Metro.dll
57 |
58 |
59 | ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll
60 |
61 |
62 | ..\packages\QRCoder.1.3.2\lib\net40\QRCoder.dll
63 |
64 |
65 |
66 |
67 |
68 |
69 | ..\packages\MahApps.Metro.1.5.0\lib\net45\System.Windows.Interactivity.dll
70 | True
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 | 4.0
80 |
81 |
82 | ..\packages\QRCoder.1.3.2\lib\net40\UnityEngine.dll
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 | MSBuild:Compile
91 | Designer
92 |
93 |
94 | MSBuild:Compile
95 | Designer
96 |
97 |
98 | App.xaml
99 | Code
100 |
101 |
102 |
103 | MainWindow.xaml
104 | Code
105 |
106 |
107 |
108 |
109 | Code
110 |
111 |
112 | True
113 | True
114 | Resources.resx
115 |
116 |
117 | True
118 | Settings.settings
119 | True
120 |
121 |
122 | ResXFileCodeGenerator
123 | Resources.Designer.cs
124 |
125 |
126 |
127 |
128 |
129 | SettingsSingleFileGenerator
130 | Settings.Designer.cs
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 | False
145 | Microsoft .NET Framework 4.5.2 %28x86 and x64%29
146 | true
147 |
148 |
149 | False
150 | .NET Framework 3.5 SP1
151 | false
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/Resources/ic_logo_transparent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tunaemre/Remote-Controller-Windows/2c3ec910660be488875b1a2409c7d18993dff6c3/Remote-Controller-Desktop/RemoteControllerDesktop/Resources/ic_logo_transparent.png
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/app_icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tunaemre/Remote-Controller-Windows/2c3ec910660be488875b1a2409c7d18993dff6c3/Remote-Controller-Desktop/RemoteControllerDesktop/app_icon.ico
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/app_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tunaemre/Remote-Controller-Windows/2c3ec910660be488875b1a2409c7d18993dff6c3/Remote-Controller-Desktop/RemoteControllerDesktop/app_logo.png
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/app_logo_transparent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tunaemre/Remote-Controller-Windows/2c3ec910660be488875b1a2409c7d18993dff6c3/Remote-Controller-Desktop/RemoteControllerDesktop/app_logo_transparent.png
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/ic_dialog_alert_holo_light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tunaemre/Remote-Controller-Windows/2c3ec910660be488875b1a2409c7d18993dff6c3/Remote-Controller-Desktop/RemoteControllerDesktop/ic_dialog_alert_holo_light.png
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/ic_vpn_key_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tunaemre/Remote-Controller-Windows/2c3ec910660be488875b1a2409c7d18993dff6c3/Remote-Controller-Desktop/RemoteControllerDesktop/ic_vpn_key_black_24dp.png
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/ic_wifi_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tunaemre/Remote-Controller-Windows/2c3ec910660be488875b1a2409c7d18993dff6c3/Remote-Controller-Desktop/RemoteControllerDesktop/ic_wifi_black_24dp.png
--------------------------------------------------------------------------------
/Remote-Controller-Desktop/RemoteControllerDesktop/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------