├── .gitattributes
├── .gitignore
├── LICENSE
├── app_binder.sln
├── app_binder
├── App.config
├── App.xaml
├── App.xaml.cs
├── MainWindow.xaml
├── MainWindow.xaml.cs
├── NotifyIconWrapper.Designer.cs
├── NotifyIconWrapper.cs
├── NotifyIconWrapper.resx
├── ProcessUtils.cs
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ ├── Settings.settings
│ └── app.manifest
├── app_binder.csproj
├── appbinder.png
├── appbinder_logo.png
├── config_window.xaml
├── config_window.xaml.cs
├── packages.config
└── startup.cs
└── readme.md
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/.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 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Build results
17 | [Dd]ebug/
18 | [Dd]ebugPublic/
19 | [Rr]elease/
20 | [Rr]eleases/
21 | x64/
22 | x86/
23 | [Aa][Rr][Mm]/
24 | [Aa][Rr][Mm]64/
25 | bld/
26 | [Bb]in/
27 | [Oo]bj/
28 | [Ll]og/
29 |
30 | # Visual Studio 2015/2017 cache/options directory
31 | .vs/
32 | # Uncomment if you have tasks that create the project's static files in wwwroot
33 | #wwwroot/
34 |
35 | # Visual Studio 2017 auto generated files
36 | Generated\ Files/
37 |
38 | # MSTest test Results
39 | [Tt]est[Rr]esult*/
40 | [Bb]uild[Ll]og.*
41 |
42 | # NUNIT
43 | *.VisualState.xml
44 | TestResult.xml
45 |
46 | # Build Results of an ATL Project
47 | [Dd]ebugPS/
48 | [Rr]eleasePS/
49 | dlldata.c
50 |
51 | # Benchmark Results
52 | BenchmarkDotNet.Artifacts/
53 |
54 | # .NET Core
55 | project.lock.json
56 | project.fragment.lock.json
57 | artifacts/
58 |
59 | # StyleCop
60 | StyleCopReport.xml
61 |
62 | # Files built by Visual Studio
63 | *_i.c
64 | *_p.c
65 | *_h.h
66 | *.ilk
67 | *.meta
68 | *.obj
69 | *.iobj
70 | *.pch
71 | *.pdb
72 | *.ipdb
73 | *.pgc
74 | *.pgd
75 | *.rsp
76 | *.sbr
77 | *.tlb
78 | *.tli
79 | *.tlh
80 | *.tmp
81 | *.tmp_proj
82 | *_wpftmp.csproj
83 | *.log
84 | *.vspscc
85 | *.vssscc
86 | .builds
87 | *.pidb
88 | *.svclog
89 | *.scc
90 |
91 | # Chutzpah Test files
92 | _Chutzpah*
93 |
94 | # Visual C++ cache files
95 | ipch/
96 | *.aps
97 | *.ncb
98 | *.opendb
99 | *.opensdf
100 | *.sdf
101 | *.cachefile
102 | *.VC.db
103 | *.VC.VC.opendb
104 |
105 | # Visual Studio profiler
106 | *.psess
107 | *.vsp
108 | *.vspx
109 | *.sap
110 |
111 | # Visual Studio Trace Files
112 | *.e2e
113 |
114 | # TFS 2012 Local Workspace
115 | $tf/
116 |
117 | # Guidance Automation Toolkit
118 | *.gpState
119 |
120 | # ReSharper is a .NET coding add-in
121 | _ReSharper*/
122 | *.[Rr]e[Ss]harper
123 | *.DotSettings.user
124 |
125 | # JustCode is a .NET coding add-in
126 | .JustCode
127 |
128 | # TeamCity is a build add-in
129 | _TeamCity*
130 |
131 | # DotCover is a Code Coverage Tool
132 | *.dotCover
133 |
134 | # AxoCover is a Code Coverage Tool
135 | .axoCover/*
136 | !.axoCover/settings.json
137 |
138 | # Visual Studio code coverage results
139 | *.coverage
140 | *.coveragexml
141 |
142 | # NCrunch
143 | _NCrunch_*
144 | .*crunch*.local.xml
145 | nCrunchTemp_*
146 |
147 | # MightyMoose
148 | *.mm.*
149 | AutoTest.Net/
150 |
151 | # Web workbench (sass)
152 | .sass-cache/
153 |
154 | # Installshield output folder
155 | [Ee]xpress/
156 |
157 | # DocProject is a documentation generator add-in
158 | DocProject/buildhelp/
159 | DocProject/Help/*.HxT
160 | DocProject/Help/*.HxC
161 | DocProject/Help/*.hhc
162 | DocProject/Help/*.hhk
163 | DocProject/Help/*.hhp
164 | DocProject/Help/Html2
165 | DocProject/Help/html
166 |
167 | # Click-Once directory
168 | publish/
169 |
170 | # Publish Web Output
171 | *.[Pp]ublish.xml
172 | *.azurePubxml
173 | # Note: Comment the next line if you want to checkin your web deploy settings,
174 | # but database connection strings (with potential passwords) will be unencrypted
175 | *.pubxml
176 | *.publishproj
177 |
178 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
179 | # checkin your Azure Web App publish settings, but sensitive information contained
180 | # in these scripts will be unencrypted
181 | PublishScripts/
182 |
183 | # NuGet Packages
184 | *.nupkg
185 | # The packages folder can be ignored because of Package Restore
186 | **/[Pp]ackages/*
187 | # except build/, which is used as an MSBuild target.
188 | !**/[Pp]ackages/build/
189 | # Uncomment if necessary however generally it will be regenerated when needed
190 | #!**/[Pp]ackages/repositories.config
191 | # NuGet v3's project.json files produces more ignorable files
192 | *.nuget.props
193 | *.nuget.targets
194 |
195 | # Microsoft Azure Build Output
196 | csx/
197 | *.build.csdef
198 |
199 | # Microsoft Azure Emulator
200 | ecf/
201 | rcf/
202 |
203 | # Windows Store app package directories and files
204 | AppPackages/
205 | BundleArtifacts/
206 | Package.StoreAssociation.xml
207 | _pkginfo.txt
208 | *.appx
209 |
210 | # Visual Studio cache files
211 | # files ending in .cache can be ignored
212 | *.[Cc]ache
213 | # but keep track of directories ending in .cache
214 | !?*.[Cc]ache/
215 |
216 | # Others
217 | ClientBin/
218 | ~$*
219 | *~
220 | *.dbmdl
221 | *.dbproj.schemaview
222 | *.jfm
223 | *.pfx
224 | *.publishsettings
225 | orleans.codegen.cs
226 |
227 | # Including strong name files can present a security risk
228 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
229 | #*.snk
230 |
231 | # Since there are multiple workflows, uncomment next line to ignore bower_components
232 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
233 | #bower_components/
234 |
235 | # RIA/Silverlight projects
236 | Generated_Code/
237 |
238 | # Backup & report files from converting an old project file
239 | # to a newer Visual Studio version. Backup files are not needed,
240 | # because we have git ;-)
241 | _UpgradeReport_Files/
242 | Backup*/
243 | UpgradeLog*.XML
244 | UpgradeLog*.htm
245 | ServiceFabricBackup/
246 | *.rptproj.bak
247 |
248 | # SQL Server files
249 | *.mdf
250 | *.ldf
251 | *.ndf
252 |
253 | # Business Intelligence projects
254 | *.rdl.data
255 | *.bim.layout
256 | *.bim_*.settings
257 | *.rptproj.rsuser
258 | *- Backup*.rdl
259 |
260 | # Microsoft Fakes
261 | FakesAssemblies/
262 |
263 | # GhostDoc plugin setting file
264 | *.GhostDoc.xml
265 |
266 | # Node.js Tools for Visual Studio
267 | .ntvs_analysis.dat
268 | node_modules/
269 |
270 | # Visual Studio 6 build log
271 | *.plg
272 |
273 | # Visual Studio 6 workspace options file
274 | *.opt
275 |
276 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
277 | *.vbw
278 |
279 | # Visual Studio LightSwitch build output
280 | **/*.HTMLClient/GeneratedArtifacts
281 | **/*.DesktopClient/GeneratedArtifacts
282 | **/*.DesktopClient/ModelManifest.xml
283 | **/*.Server/GeneratedArtifacts
284 | **/*.Server/ModelManifest.xml
285 | _Pvt_Extensions
286 |
287 | # Paket dependency manager
288 | .paket/paket.exe
289 | paket-files/
290 |
291 | # FAKE - F# Make
292 | .fake/
293 |
294 | # JetBrains Rider
295 | .idea/
296 | *.sln.iml
297 |
298 | # CodeRush personal settings
299 | .cr/personal
300 |
301 | # Python Tools for Visual Studio (PTVS)
302 | __pycache__/
303 | *.pyc
304 |
305 | # Cake - Uncomment if you are using it
306 | # tools/**
307 | # !tools/packages.config
308 |
309 | # Tabs Studio
310 | *.tss
311 |
312 | # Telerik's JustMock configuration file
313 | *.jmconfig
314 |
315 | # BizTalk build output
316 | *.btp.cs
317 | *.btm.cs
318 | *.odx.cs
319 | *.xsd.cs
320 |
321 | # OpenCover UI analysis results
322 | OpenCover/
323 |
324 | # Azure Stream Analytics local run output
325 | ASALocalRun/
326 |
327 | # MSBuild Binary and Structured Log
328 | *.binlog
329 |
330 | # NVidia Nsight GPU debugger configuration file
331 | *.nvuser
332 |
333 | # MFractors (Xamarin productivity tool) working folder
334 | .mfractor/
335 |
336 | # Local History for Visual Studio
337 | .localhistory/
338 |
339 | # BeatPulse healthcheck temp database
340 | healthchecksdb
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 TenteEEEE
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/app_binder.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.30204.135
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "app_binder", "app_binder\app_binder.csproj", "{BEA3B239-523E-4DC8-8C84-DBA143EEFA21}"
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 | {BEA3B239-523E-4DC8-8C84-DBA143EEFA21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {BEA3B239-523E-4DC8-8C84-DBA143EEFA21}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {BEA3B239-523E-4DC8-8C84-DBA143EEFA21}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {BEA3B239-523E-4DC8-8C84-DBA143EEFA21}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {17F1C8A2-CBDF-4FAD-8FE5-91C1BBD27C75}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/app_binder/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app_binder/App.xaml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/app_binder/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using AppBinder;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Configuration;
5 | using System.Data;
6 | using System.Linq;
7 | using System.Threading.Tasks;
8 | using System.Windows;
9 |
10 | namespace AppBinder
11 | {
12 | ///
13 | /// App.xaml の相互作用ロジック
14 | ///
15 | public partial class App : Application
16 | {
17 | ///
18 | /// タスクトレイに表示するアイコン
19 | ///
20 | private NotifyIconWrapper notifyIcon;
21 |
22 | ///
23 | /// System.Windows.Application.Startup イベント を発生させます。
24 | ///
25 | /// イベントデータ を格納している StartupEventArgs
26 | protected override void OnStartup(StartupEventArgs e)
27 | {
28 | base.OnStartup(e);
29 | this.ShutdownMode = ShutdownMode.OnExplicitShutdown;
30 | this.notifyIcon = new NotifyIconWrapper();
31 | }
32 |
33 | ///
34 | /// System.Windows.Application.Exit イベント を発生させます。
35 | ///
36 | /// イベントデータ を格納している ExitEventArgs
37 | protected override void OnExit(ExitEventArgs e)
38 | {
39 | base.OnExit(e);
40 | this.notifyIcon.Dispose();
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app_binder/MainWindow.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/app_binder/MainWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using System.Collections.ObjectModel;
4 | using MahApps.Metro.Controls;
5 | using System.ComponentModel;
6 | using System.IO;
7 | using Newtonsoft.Json;
8 |
9 | namespace AppBinder
10 | {
11 | public partial class MainWindow : MetroWindow
12 | {
13 | public ObservableCollection configs = new ObservableCollection();
14 | public MainWindow()
15 | {
16 | InitializeComponent();
17 | serialize_objects[] objs;
18 | try
19 | {
20 | var json = File.ReadAllText("./config.json");
21 | objs = JsonConvert.DeserializeObject(json);
22 | foreach (var o in objs)
23 | {
24 | var pc = new ProcessRunner();
25 | pc.load_config(o);
26 | configs.Add(pc);
27 | }
28 | }
29 | catch (Exception)
30 | {
31 |
32 | }
33 | dataGrid_config.ItemsSource = configs;
34 | this.Loaded += minimized_startup;
35 | }
36 |
37 | private void minimized_startup(object sender, RoutedEventArgs e)
38 | {
39 | string[] args = Environment.GetCommandLineArgs();
40 | foreach (string arg in args)
41 | {
42 | if (arg == "-m" || arg == "--minimum")
43 | {
44 | this.WindowState = WindowState.Minimized;
45 | }
46 | }
47 | this.Loaded -= minimized_startup;
48 | }
49 |
50 | private void button_add_Click(object sender, RoutedEventArgs e)
51 | {
52 | config_window cw = new config_window();
53 | cw.Owner = this;
54 | cw.Show();
55 | }
56 |
57 | private void button_edit_Click(object sender, RoutedEventArgs e)
58 | {
59 | if (configs.Count < 1 || dataGrid_config.SelectedIndex < 0) return;
60 | config_window cw = new config_window();
61 | cw.load_config(configs[dataGrid_config.SelectedIndex].serialize(), dataGrid_config.SelectedIndex);
62 | cw.Owner = this;
63 | cw.Show();
64 | }
65 |
66 | private void button_delete_Click(object sender, RoutedEventArgs e)
67 | {
68 | if (configs.Count < 1 || dataGrid_config.SelectedIndex < 0) return;
69 | configs[dataGrid_config.SelectedIndex].Dispose();
70 | configs.Remove(configs[dataGrid_config.SelectedIndex]);
71 | }
72 |
73 | private void MetroWindow_Closing(object sender, CancelEventArgs e)
74 | {
75 | save_configs();
76 | Application.Current.Shutdown();
77 | }
78 |
79 | private void save_configs()
80 | {
81 | serialize_objects[] objs = new serialize_objects[configs.Count];
82 | for (int i = 0; i < objs.Length; i++)
83 | {
84 | objs[i] = configs[i].serialize();
85 | }
86 | var json = JsonConvert.SerializeObject(objs,Formatting.Indented);
87 | try
88 | {
89 | File.WriteAllText("./config.json", json);
90 | }
91 | catch (Exception)
92 | {
93 | }
94 | }
95 | private void c_StateChanged(object sender, EventArgs e)
96 | {
97 | save_configs();
98 | if (this.WindowState == WindowState.Minimized)
99 | {
100 | this.ShowInTaskbar = false;
101 | }
102 | else if (this.WindowState == WindowState.Normal)
103 | {
104 | this.ShowInTaskbar = true;
105 | }
106 | }
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/app_binder/NotifyIconWrapper.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace AppBinder
2 | {
3 | partial class NotifyIconWrapper
4 | {
5 | ///
6 | /// 必要なデザイナー変数です。
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// 使用中のリソースをすべてクリーンアップします。
12 | ///
13 | /// マネージド リソースを破棄する場合は true を指定し、その他の場合は 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 コンポーネント デザイナーで生成されたコード
24 |
25 | ///
26 | /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
27 | /// コード エディターで変更しないでください。
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.components = new System.ComponentModel.Container();
32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NotifyIconWrapper));
33 | this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
34 | this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
35 | this.toolStripMenuItem_Open = new System.Windows.Forms.ToolStripMenuItem();
36 | this.toolStripMenuItem_Exit = new System.Windows.Forms.ToolStripMenuItem();
37 | this.contextMenuStrip1.SuspendLayout();
38 | //
39 | // notifyIcon1
40 | //
41 | this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1;
42 | this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));
43 | this.notifyIcon1.Text = "AppBinder";
44 | this.notifyIcon1.Visible = true;
45 | this.notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick);
46 | //
47 | // contextMenuStrip1
48 | //
49 | this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
50 | this.toolStripMenuItem_Open,
51 | this.toolStripMenuItem_Exit});
52 | this.contextMenuStrip1.Name = "contextMenuStrip1";
53 | this.contextMenuStrip1.Size = new System.Drawing.Size(104, 48);
54 | //
55 | // toolStripMenuItem_Open
56 | //
57 | this.toolStripMenuItem_Open.Name = "toolStripMenuItem_Open";
58 | this.toolStripMenuItem_Open.Size = new System.Drawing.Size(103, 22);
59 | this.toolStripMenuItem_Open.Text = "Open";
60 | //
61 | // toolStripMenuItem_Exit
62 | //
63 | this.toolStripMenuItem_Exit.Name = "toolStripMenuItem_Exit";
64 | this.toolStripMenuItem_Exit.Size = new System.Drawing.Size(103, 22);
65 | this.toolStripMenuItem_Exit.Text = "Exit";
66 | this.contextMenuStrip1.ResumeLayout(false);
67 |
68 | }
69 |
70 | #endregion
71 |
72 | private System.Windows.Forms.NotifyIcon notifyIcon1;
73 | private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
74 | private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Open;
75 | private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Exit;
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/app_binder/NotifyIconWrapper.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Diagnostics;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 | using System.Windows;
9 |
10 | namespace AppBinder
11 | {
12 | public partial class NotifyIconWrapper : Component
13 | {
14 | public NotifyIconWrapper()
15 | {
16 | InitializeComponent();
17 | this.toolStripMenuItem_Open.Click += this.toolStripMenuItem_Open_Click;
18 | this.toolStripMenuItem_Exit.Click += this.toolStripMenuItem_Exit_Click;
19 | }
20 |
21 | public NotifyIconWrapper(IContainer container)
22 | {
23 | container.Add(this);
24 |
25 | InitializeComponent();
26 | }
27 |
28 | private void toolStripMenuItem_Open_Click(object sender, EventArgs e)
29 | {
30 | Application.Current.MainWindow.WindowState = WindowState.Normal;
31 | }
32 | private void notifyIcon1_DoubleClick(object sender, EventArgs e)
33 | {
34 | Application.Current.MainWindow.WindowState = WindowState.Normal;
35 | }
36 |
37 | private void toolStripMenuItem_Exit_Click(object sender, EventArgs e)
38 | {
39 | Application.Current.Shutdown();
40 | }
41 |
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app_binder/NotifyIconWrapper.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, 56
122 |
123 |
124 | 130, 17
125 |
126 |
127 |
128 |
129 | AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
130 | IACoJQAA7h4AAAAAAAABACAArR0AAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAjLgAAIy4AAAAA
131 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
132 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wn///8T////Af///wAAAAAAAAAAAP///wD///8A////E///
133 | /wn///8AAAAAAAAAAAAAAAAA////AP///xT///+Z////p////wr///8AAAAAAAAAAAD///8A////Cf//
134 | /6b///+Z////FP///wD///8A////AP///wn///+X/////////6v///8F////AAAAAAAAAAAA////AP//
135 | /wT///+o/////////5v///8K////AP///wD///9X////8P////r////b////If///wAAAAAAAAAAAP//
136 | /wD///8g////2v////r////x////Wf///wD///8K////t////6v///91////9P///2r///8A////AP//
137 | /wD///8A////Z/////X///92////qf///7n///8L////LP///+D///9Z////BP///6H///++////Df//
138 | /wD///8A////DP///7z///+k////BP///1f////h////Lv///0f////k////Nv///wD///8w////1f//
139 | /1f///9c////XP///1b////W////Mv///wD///80////5P///0n///9G////5P///zb///8A////Af//
140 | /47////k////nf///57////l////kf///wH///8A////NP///+T///9J////LP///+D///9b////AP//
141 | /wD///83////0f///yj///8n////0f///zn///8A////AP///1j////h////Lv///wr///+2////qv//
142 | /wf///8A////B////6v///9r////af///63///8H////AP///wb///+o////uP///wv///8A////Vv//
143 | /+n///9Z////AP///wD///9d////xf///8T///9f////AP///wD///9W////6f///1j///8A////AP//
144 | /wj///+X////5P///1n///8E////G////9f////Z////Hf///wT///9X////4////5r///8J////AAAA
145 | AAD///8A////E////5f////s////q////1v///+7////vf///1v///+p////7P///5n///8U////AP//
146 | /wAAAAAAAAAAAP///wD///8J////Vf///7f////h////7f///+3////h////uP///1f///8J////AAAA
147 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8K////LP///0b///9G////LP///wr///8A////AAAA
148 | AAAAAAAAAAAAAP//AADj5wAAw8MAAIPBAACDwQAAA8AAAAGAAAAQCAAAEAgAABgYAAAIEAAAjDEAAIAB
149 | AADAAwAA4AcAAPgfAAAoAAAAGAAAADAAAAABACAAAAAAAAAJAAAjLgAAIy4AAAAAAAAAAAAAAAAAAAAA
150 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
151 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
152 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
153 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8J////Gf///wP///8AAAAAAAAAAAAAAAAAAAAAAAAA
154 | AAAAAAAA////AP///wP///8Y////Cf///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
155 | /xr///+b////1////z7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///zv////W////nP//
156 | /xr///8A////AAAAAAAAAAAAAAAAAAAAAAD///8A////Gf///7L/////////6v///zr///8AAAAAAAAA
157 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///zf////o/////////7T///8c////AP///wAAAAAAAAAAAP//
158 | /wD///8J////nP//////////////3f///yH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
159 | /x/////b//////////////+g////C////wAAAAAA////AP///wD///9b////9////////////////f//
160 | /2j///8A////AAAAAAAAAAAAAAAAAAAAAAD///8A////AP///2T////9///////////////4////X///
161 | /wD///8A////AP///xH////D////+////7L////q/////////7v///8M////AAAAAAAAAAAAAAAAAAAA
162 | AAD///8A////C////7f/////////7P///7L////6////xv///xP///8A////AP///0f////5////zf//
163 | /xj///9o////9v////L///9B////AAAAAAAAAAAAAAAAAAAAAAD///8A////Pv////H////3////a///
164 | /xf////K////+v///0v///8A////AP///4T/////////h////wD///8H////mv////////+U////Af//
165 | /wAAAAAAAAAAAP///wD///8A////kP////////+e////CP///wD///+D/////////4j///8A////BP//
166 | /6z/////////Vf///wD///8A////KP///93////e////Iv///wD///8A////AP///wD///8f////2///
167 | /+D///8r////AP///wD///9R/////////7D///8G////C////7/////4////Pv///wD///8A////AP//
168 | /3n////9////bv///0P///+Z////mf///0X///9r/////f///33///8A////AP///wD///86////9///
169 | /8P///8N////C////7/////5////Pv///wAAAAAA////AP///yD////Y////6f///+j////K////yv//
170 | /+n////p////2////yP///8AAAAAAP///wD///87////9////8P///8N////BP///6z/////////Vf//
171 | /wAAAAAA////AP///wD///+C/////////5D///8N////Dv///5P/////////hv///wD///8AAAAAAP//
172 | /wD///9R/////////6////8F////AP///4P/////////if///wD///8AAAAAAP///wD///8u////6f//
173 | /5b///8B////AP///5L////r////Mf///wAAAAAA////AP///wD///+F/////////4f///8A////AP//
174 | /0f////4////z////xf///8AAAAAAP///wD///8E////pP///+H///8h////H////9////+o////Bf//
175 | /wAAAAAA////AP///xX////M////+f///0r///8A////AP///xD////B/////////2////8A////AP//
176 | /wD///8A////UP////f///9p////Zf////f///9T////AP///wD///8A////AP///2v////+////xf//
177 | /xL///8A////AP///wD///9Z////+P///+H///87////AP///wD///8A////Ff///9D////M////yv//
178 | /9P///8X////AP///wD///8A////OP///9/////5////XP///wD///8AAAAAAP///wD///8I////mf//
179 | ///////R////O////wD///8A////AP///4b//////////////4r///8A////AP///wD///84////z///
180 | //////+d////Cv///wAAAAAAAAAAAAAAAAD///8A////GP///6//////////4f///2////8W////AP//
181 | /zv////x////8////z////8A////Ff///2z////g/////////7L///8a////AAAAAAAAAAAAAAAAAAAA
182 | AAD///8A////AP///xj///+a////9/////z////P////h////2L////e////4P///2P///+G////zv//
183 | //z////3////nP///xr///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8J////WP//
184 | /8L////3//////////7////+/////v////7/////////+P///8T///9a////Cv///wD///8AAAAAAAAA
185 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///xD///9G////g////6z///+/////v///
186 | /63///+E////R////xH///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
187 | AAAAAAAAAAAAAAAAAAD///8A////AP///wT///8L////C////wT///8A////AAAAAAAAAAAAAAAAAAAA
188 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD4/x8A8P8PAOD/BwDA/wMAwP8DAIB+AQCAfgEAiD4RAAw8
189 | MAAOAHAADgBwAA8A8ACPCPEAhwDhAIeB4QDDgcMAwcODAOBCBwDwAA8A+AAfAP4AfwD/w/8AKAAAACAA
190 | AABAAAAAAQAgAAAAAAAAEAAAIy4AACMuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
191 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
192 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
193 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
194 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
195 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
196 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
197 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8J////HP///wj///8AAAAAAAAAAAAAAAAAAAAAAAAA
198 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8H////HP///wn///8A////AAAAAAAAAAAAAAAAAAAA
199 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////Hv///57////h////ff///wH///8AAAAAAAAA
200 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///3n////g////oP///x3///8A////AAAA
201 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///yf///+///////////////+x////Bf//
202 | /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8E////rP//////////////vv//
203 | /yr///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8d////vf//////////////9f//
204 | /1L///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///9N////8///
205 | ////////////w////yL///8A////AAAAAAAAAAAAAAAAAAAAAAD///8A////Cv///5//////////////
206 | ///////9////ZP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
207 | /1/////7////////////////////pP///wv///8AAAAAAAAAAAAAAAAA////AP///wD///9e////9///
208 | //////////////////////+6////DP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
209 | /wD///8K////tf/////////////////////////5////Y////wD///8AAAAAAAAAAAD///8A////F///
210 | /8r/////////9f////P///////////////H///9A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
211 | AAAAAAAA////AP///zz////v///////////////0////9f/////////N////Gf///wAAAAAA////AP//
212 | /wD///9e////+/////////+T////Xv///+n//////////////5L///8B////AAAAAAAAAAAAAAAAAAAA
213 | AAAAAAAAAAAAAP///wD///8A////jf//////////////6////2D///+O//////////z///9j////AP//
214 | /wD///8A////Bf///6v/////////6////zT///8A////Zf////X/////////2////yH///8AAAAAAAAA
215 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///x7////Y//////////b///9q////AP///zD////o////////
216 | /7H///8H////AP///wD///8g////3v////////+2////Cf///wD///8H////l//////////+////af//
217 | /wD///8AAAAAAAAAAAAAAAAAAAAAAP///wD///8A////Y/////3/////////nP///wj///8A////B///
218 | /7H/////////4f///yP///8A////AP///0H////1/////////37///8A////AP///wD///8k////1v//
219 | //////+8////DP///wAAAAAAAAAAAAAAAAAAAAAA////AP///wv///+3/////////9n///8n////AP//
220 | /wD///8A////ef/////////3////Rv///wD///8A////XP////7////9////Wf///wAAAAAA////AP//
221 | /wD///9s/////f////L///9C////AP///wL///8N////Df///wL///8A////Pf////D////+////cf//
222 | /wD///8AAAAAAP///wD///9U/////P////////9i////AP///wD///9s//////////j///9H////AAAA
223 | AAAAAAAA////AP///xX////H/////////5T///8l////if///8j////J////i////yf///+P////////
224 | /8v///8Y////AAAAAAAAAAAA////AP///0L////3/////////3H///8A////AP///2v/////////+P//
225 | /0f///8AAAAAAAAAAAD///8A////AP///2X////9////6v///9n////+////6P///+j////+////3P//
226 | /+n////+////av///wD///8AAAAAAAAAAAD///8A////Q/////f/////////cv///wD///8A////XP//
227 | //7////9////Wv///wAAAAAAAAAAAAAAAAD///8A////GP///83/////////9P///4f///8m////Jv//
228 | /4r////2/////////9H///8b////AAAAAAAAAAAAAAAAAP///wD///9V/////P////////9h////AP//
229 | /wD///9A////9f////////+A////AP///wAAAAAAAAAAAP///wD///8A////d//////////O////FP//
230 | /wD///8A////FP///83/////////fP///wD///8AAAAAAAAAAAD///8A////AP///3r/////////9///
231 | /0X///8A////AP///x7////d/////////7j///8J////AAAAAAAAAAAAAAAAAP///wD///8n////4f//
232 | //T///9D////AP///wD///8/////8v///+T///8q////AAAAAAAAAAAAAAAAAP///wD///8H////s///
233 | ///////h////Iv///wD///8A////Bf///6r/////////7P///zb///8AAAAAAAAAAAAAAAAA////AP//
234 | /wL///+Z/////////5f///8B////AP///5H/////////nv///wP///8AAAAAAAAAAAAAAAAA////AP//
235 | /zL////p/////////6////8G////AP///wD///8A////XP////v/////////lP///wP///8AAAAAAAAA
236 | AAD///8A////AP///0b////2////3////yL///8e////2/////j///9L////AP///wAAAAAAAAAAAP//
237 | /wD///8C////j//////////8////Yf///wD///8AAAAAAP///wD///8V////x//////////t////Rv//
238 | /wD///8AAAAAAAAAAAD///8A////EP///8P/////////av///2X/////////yP///xL///8AAAAAAAAA
239 | AAD///8A////AP///0L////r/////////8v///8Y////AAAAAAAAAAAA////AP///wD///9b////9v//
240 | ///////K////Jf///wD///8AAAAAAP///wD///8A////d//////////K////x/////////99////AP//
241 | /wAAAAAA////AP///wD///8j////xv/////////3////X////wD///8AAAAAAAAAAAAAAAAA////AP//
242 | /wn///+b//////////////+7////Jf///wD///8AAAAAAP///wD///8w////6f/////////+////7P//
243 | /zT///8AAAAAAP///wD///8A////I////7j//////////////6D///8K////AAAAAAAAAAAAAAAAAAAA
244 | AAAAAAAA////AP///xz///+7///////////////L////Rv///wT///8A////AP///wj///+y////////
245 | //////+3////Cv///wD///8A////A////0P////I//////////////++////Hv///wD///8AAAAAAAAA
246 | AAAAAAAAAAAAAAAAAAD///8A////AP///yX///+7///////////////t////lP///zX///8J////AP//
247 | /2f////+/////////2z///8A////CP///zT///+S////7P//////////////v////yj///8A////AAAA
248 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///xv///+c////9v//////////////7P//
249 | /7j///99////ff////P////1////f////3z///+2////6///////////////9////5////8d////AP//
250 | /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wn///9a////yP//
251 | //r////////////////////9/////v////7////9////////////////////+////8r///9d////Cv//
252 | /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
253 | /wD///8V////W////6r////e////9f////7///////////////7////2////3v///6z///9e////Fv//
254 | /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
255 | AAAAAAAAAAAAAP///wD///8A////Bf///x////9A////XP///2z///9s////Xf///0H///8f////Bv//
256 | /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
257 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
258 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
259 | ///+P/x//B/8P/gf+B/wP/wP4D/8B+Af+AfAH/gDwA/4A4IP8EGCD/BBhwfg4YeEIeGHgAHhh8AD4YfA
260 | A+GH4Yfhg+GHwYPgh8HB8A+DwfAPg+D4HwfgeB4H8BgYD/gEIB/8AAA//gAAf/+AAf//4Af//////ygA
261 | AAAwAAAAYAAAAAEAIAAAAAAAACQAACMuAAAjLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
262 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
263 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
264 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
265 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
266 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
267 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
268 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
269 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
270 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
271 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
272 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
273 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
274 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
275 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
276 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
277 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
278 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wn///8g////E////wH///8AAAAAAAAAAAAAAAAAAAAAAAAA
279 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////Ev//
280 | /yD///8K////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
281 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////I////6D////i////yf///0D///8A////AAAA
282 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
283 | /wD///87////xv///+L///+l////Jf///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
284 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///87////yv//////////////////
285 | /5v///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
286 | AAAAAAAA////AP///wD///+T////////////////////yP///zj///8A////AAAAAAAAAAAAAAAAAAAA
287 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///0P////b////////
288 | /////////////////5P///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
289 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///+L/////////////////////////9v///9H////AP//
290 | /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////OP//
291 | /9j/////////////////////////yv///y3///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
292 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8o////xf//////////////////
293 | ///////f////Qv///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
294 | /wD///8j////yP//////////////////////////////t////wr///8AAAAAAAAAAAAAAAAAAAAAAAAA
295 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8I////sP//
296 | ////////////////////////////0f///yn///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
297 | AAAAAAAA////AP///wv///+j////////////////////////////////////8P///z7///8A////AAAA
298 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
299 | /wD///83////7P///////////////////////////////////6r///8N////AAAAAAAAAAAAAAAAAAAA
300 | AAAAAAAAAAAAAAAAAAD///8A////AP///2P////4////////////////////////////////////////
301 | /4////8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
302 | AAAAAAAA////AP///wD///+I//////////////////////////////////////////r///9p////AP//
303 | /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Hv///9H/////////////////////////////
304 | /////////////////9n///8g////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
305 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///xv////U////////////////////////////////////////
306 | ///////W////Iv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////d///////////////////
307 | //D////v//////////////////////////3///9m////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
308 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///17////7////////////////////////
309 | //D////v////////////////////ff///wD///8AAAAAAAAAAAAAAAAAAAAAAP///wD///8Y////z///
310 | /////////////////4H///9P////3f////////////////////////+5////DP///wAAAAAAAAAAAAAA
311 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Cf///7L/////////////
312 | ////////////4f///1P///96/////v//////////////1P///x3///8AAAAAAAAAAAAAAAAA////AP//
313 | /wD///9W////+v//////////////2////yP///8A////R////+P////////////////////x////QP//
314 | /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Of//
315 | /+3////////////////////n////Tf///wD///8f////1v///////////////P///1////8A////AAAA
316 | AAAAAAAA////AP///wL///+e////////////////////j////wD///8A////AP///2D////0////////
317 | ////////////kv///wH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
318 | /wD///8A////iv////////////////////b///9n////AP///wD///8A////iP//////////////////
319 | /6b///8E////AAAAAAAAAAAA////AP///xn////V///////////////0////Rf///wAAAAAA////AP//
320 | /wb///+S////////////////////2////yH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
321 | AAAAAAAAAAAAAP///wD///8c////1v///////////////////5n///8I////AAAAAAD///8A////Pv//
322 | //H//////////////9r///8d////AAAAAAAAAAAA////AP///zz////y///////////////S////Fv//
323 | /wAAAAAAAAAAAP///wD///8f////zv///////////////f///2j///8A////AAAAAAAAAAAAAAAAAAAA
324 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///9g/////P//////////////0////yT///8A////AAAA
325 | AAD///8A////Ev///8z///////////////X///9C////AAAAAAAAAAAA////AP///1/////+////////
326 | //////+n////A////wAAAAAAAAAAAP///wD///8A////W/////f//////////////7v///8M////AAAA
327 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr///+0///////////////5////Yv//
328 | /wD///8AAAAAAAAAAAD///8A////Af///6D///////////////////9p////AAAAAAD///8A////AP//
329 | /37///////////////////+D////AP///wAAAAAAAAAAAAAAAAD///8A////C////6//////////////
330 | //H///9C////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///zv////u////////
331 | //////+2////Dv///wAAAAAAAAAAAAAAAAD///8A////AP///3v///////////////////+H////AP//
332 | /wD///8A////AP///5T///////////////////9q////AAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
333 | /0T////v//////////////+U////Af///wD///8J////Mf///1X///9V////Mv///wr///8A////AP//
334 | /4z///////////////L///9K////AP///wAAAAAAAAAAAAAAAAAAAAAA////AP///2L/////////////
335 | //////+b////AP///wD///8A////Af///57///////////////7///9d////AAAAAAAAAAAAAAAAAAAA
336 | AAAAAAAA////AP///wb///+k///////////////c////JP///zn///+t////7P////z////8////7P//
337 | /7D///8/////IP///9f//////////////6v///8J////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
338 | /1X////8//////////////+l////Av///wD///8A////AP///53///////////////7///9d////AAAA
339 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///9A////7//////////7////sf///+L/////////////
340 | ///////////////////////m////tP////n/////////8v///0f///8A////AAAAAAAAAAAAAAAAAAAA
341 | AAAAAAAA////AP///1b////8//////////////+m////Av///wD///8A////AP///5L/////////////
342 | //////9r////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8H////qf//////////////////
343 | ///////6////wP///33///98////wP////r/////////////////////////sP///wr///8AAAAAAAAA
344 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///2P///////////////////+b////AP///wAAAAAA////AP//
345 | /37///////////////////+F////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////S///
346 | //T///////////////H///97////Ef///wD///8A////Ef///4L////1///////////////3////Uv//
347 | /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///3z///////////////////+F////AP//
348 | /wAAAAAA////AP///1/////+//////////////+p////A////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
349 | AAD///8A////Df///7v//////////////7L///8I////AAAAAAAAAAAA////AP///wr///+0////////
350 | ///////C////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Av///6H/////////////
351 | //////9m////AAAAAAAAAAAA////AP///zr////x///////////////T////F////wAAAAAAAAAAAAAA
352 | AAAAAAAAAAAAAAAAAAD///8A////AP///2L////8/////////93///8k////AAAAAAAAAAAA////AP//
353 | /x7////X//////////3///9q////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////FP//
354 | /87///////////////X///9B////AAAAAAAAAAAA////AP///xf////T///////////////1////R///
355 | /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///xv////T//////////7///9t////AP//
356 | /wD///8A////AP///2X////9/////////9n///8g////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
357 | AAD///8A////QP////L//////////////9n///8c////AAAAAAAAAAAA////AP///wH///+c////////
358 | ////////////kv///wH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///+F////////
359 | //////+/////Dv///wD///8A////C////7j//////////////43///8A////AAAAAAAAAAAAAAAAAAAA
360 | AAAAAAAAAAAAAP///wD///8A////i////////////////////6T///8D////AAAAAAAAAAAA////AP//
361 | /wD///9V////+f//////////////3f///yb///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
362 | /wD///82////6//////////z////Rf///wD///8A////P/////D/////////7////zz///8A////AAAA
363 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8h////2P//////////////+////1v///8A////AAAA
364 | AAAAAAAAAAAAAP///wD///8X////zP///////////////////4b///8B////AAAAAAAAAAAAAAAAAAAA
365 | AAAAAAAAAAAAAP///wD///8I////sP//////////////mP///wL///8A////kf//////////////t///
366 | /wr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///9+////////////////////0v//
367 | /xv///8AAAAAAAAAAAAAAAAAAAAAAP///wD///8A////cf////7//////////////+b///86////AP//
368 | /wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////X/////z/////////3////yP///8e////2v//
369 | ///////9////Z////wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///zT////i////////
370 | ////////////ev///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////G////83/////////////
371 | //////+4////Ff///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////H////9n//////////v//
372 | /2v///9k/////f/////////e////I////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Ev//
373 | /7L////////////////////S////H////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
374 | /13////2///////////////9////k////wv///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af//
375 | /5X//////////////8v////H//////////////+d////Av///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
376 | /wD///8J////jP////3///////////////j///9j////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
377 | AAAAAAAA////AP///wn///+d////////////////////+f///4f///8L////AAAAAAAAAAAAAAAAAAAA
378 | AAAAAAAA////AP///0n////2//////////3////9//////////j///9Q////AAAAAAAAAAAAAAAAAAAA
379 | AAAAAAAA////AP///wn///+B////+P///////////////////6X///8L////AAAAAAAAAAAAAAAAAAAA
380 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8f////xf////////////////////n///+T////Ff//
381 | /wD///8AAAAAAAAAAAAAAAAA////AP///xT////L/////////////////////////9H///8X////AAAA
382 | AAAAAAAAAAAAAP///wD///8A////Ev///43////4////////////////////yv///yT///8A////AAAA
383 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////Nv///9f/////////////
384 | ///////9////uf///zn///8C////AAAAAAAAAAAA////AP///wD///+F////////////////////////
385 | /43///8A////AAAAAAAAAAAA////AP///wL///82////tf////z////////////////////a////Ov//
386 | /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
387 | /z7////W/////////////////////////+f///+G////Jf///wL///8AAAAAAP///wD///8+////8f//
388 | ////////////9P///0X///8A////AP///wD///8C////I////4H////k////////////////////////
389 | /9v///9E////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
390 | AAAAAAAA////AP///wD///81////xf/////////////////////////+////3v///5P///9G////F///
391 | /wL///8O////wv//////////////yP///xL///8C////Fv///0T///+P////3P////7/////////////
392 | ////////////yv///zr///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
393 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////IP///57////2////////////////////////
394 | ///////1////1P///6n///+E////w///////////////yP///4P///+n////0v////T/////////////
395 | //////////////////j///+i////Iv///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
396 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wn///9b////zf//
397 | //3/////////////////////////////////////////////////////////////////////////////
398 | ///////////////////////9////0f///2H///8L////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
399 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
400 | /wD///8A////Gv///3L////O////+f//////////////////////////////////////////////////
401 | ////////////////////////////+v///8////91////HP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA
402 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
403 | AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8W////U////5z////U////8v////3/////////////
404 | ///////////////////////+////8v///9X///+f////V////xj///8A////AAAAAAAAAAAAAAAAAAAA
405 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
406 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wP///8X////Ov//
407 | /1////99////k////57///+d////k////3////9h////O////xj///8D////AAAAAAAAAAAAAAAAAAAA
408 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
409 | 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
548 | KCv+AAAAAElFTkSuQmCC
549 |
550 |
551 |
552 | False
553 |
554 |
--------------------------------------------------------------------------------
/app_binder/ProcessUtils.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Threading;
3 | using System.Diagnostics;
4 | using System.ComponentModel;
5 | using Reactive.Bindings;
6 | using System.Threading.Tasks;
7 |
8 | public enum RESTART_POLICY { NEVER, ON_FAILUER, ALWAYS };
9 |
10 | namespace AppBinder
11 | {
12 | ///
13 | /// Check number of process.
14 | /// Action "cb_up" and "cb_down" acheive callbacks when the monitoring process is upped or downed.
15 | ///
16 | public class ProcessChecker : IDisposable
17 | {
18 | private bool _disposed = false;
19 |
20 | private Process[] plist;
21 | private DispatcherTimer timer;
22 | public Action cb_up;
23 | public Action cb_down;
24 | public int pnum { get; set; }
25 | public string process_name { get; set; }
26 | public ProcessChecker(string pname)
27 | {
28 | process_name = pname;
29 | pnum = get_number_of_process();
30 | timer = new DispatcherTimer();
31 | timer.Interval = TimeSpan.FromSeconds(1);
32 | timer.Tick += timer_Tick;
33 | timer.Start();
34 | }
35 | private void timer_Tick(object sender, EventArgs e)
36 | {
37 | if (process_name != "")
38 | {
39 | plist = Process.GetProcessesByName(process_name);
40 | }
41 | if (plist != null)
42 | {
43 | if (pnum < plist.Length)
44 | {
45 | cb_up(plist.Length);
46 | }
47 | else if (pnum > plist.Length)
48 | {
49 | cb_down(plist.Length);
50 | }
51 | pnum = plist.Length;
52 | }
53 | }
54 | public int get_number_of_process()
55 | {
56 | if (process_name != "")
57 | {
58 | plist = Process.GetProcessesByName(process_name);
59 | return plist.Length;
60 | }
61 | else
62 | {
63 | return 0;
64 | }
65 | }
66 | public void stop()
67 | {
68 | timer.Stop();
69 | }
70 |
71 | ///
72 | /// Releases the unmanaged resources and disposes of unmanaged resources used by the .
73 | ///
74 | public void Dispose()
75 | {
76 | Dispose(true);
77 | }
78 |
79 | ///
80 | /// Releases the unmanaged resources used by the and optionally disposes of the managed resources.
81 | ///
82 | /// true to release both managed and unmanaged resources; false to releases only unmanaged resources.
83 | protected virtual void Dispose(bool disposing)
84 | {
85 | if (_disposed)
86 | {
87 | return;
88 | }
89 |
90 | if (disposing)
91 | {
92 | //dispose managed resources
93 | if (plist != null)
94 | {
95 | foreach (var p in plist)
96 | {
97 | p?.Dispose();
98 | }
99 | }
100 | }
101 |
102 | _disposed = true;
103 | }
104 | }
105 | ///
106 | /// Serialize object for ProcessRunner
107 | ///
108 | public class serialize_objects
109 | {
110 | public bool is_enable { get; set; }
111 | public string config_name { get; set; }
112 | public string status { get; set; }
113 | public string trigger_process { get; set; }
114 | public string bind_process { get; set; }
115 | public string args { get; set; }
116 | public int start_delay { get; set; }
117 | public RESTART_POLICY restarter { get; set; }
118 | }
119 | ///
120 | /// Process runner with monitoring
121 | ///
122 | public class ProcessRunner : INotifyPropertyChanged, IDisposable
123 | {
124 | private bool _disposed = false;
125 |
126 | public event PropertyChangedEventHandler PropertyChanged;
127 | private ProcessChecker PC;
128 | // Binding source
129 | public ReactiveProperty is_enable { get; } = new ReactiveProperty();
130 | public ReactiveProperty config_name { get; } = new ReactiveProperty();
131 | public ReactiveProperty status { get; } = new ReactiveProperty();
132 |
133 | // Others
134 | public Process binding_process;
135 | public string trigger_name { get; set; }
136 | public int start_delay { get; set; }
137 | public RESTART_POLICY restarter { get; set; }
138 | public ProcessRunner()
139 | {
140 | binding_process = new Process();
141 | binding_process.EnableRaisingEvents = true;
142 | binding_process.Exited += new EventHandler(proc_Exited);
143 | PC = new ProcessChecker("");
144 | }
145 |
146 | public void setup(string name, string trigger_exe, string run_exe, string args, string sdelay, RESTART_POLICY mode)
147 | {
148 | config_name.Value = name;
149 | trigger_name = System.IO.Path.GetFileNameWithoutExtension(trigger_exe);
150 | if (binding_process.StartInfo.FileName != "" && binding_process.StartInfo.FileName != run_exe) // already running something
151 | {
152 | binding_process.Kill();
153 | }
154 | binding_process.StartInfo.FileName = run_exe;
155 | binding_process.StartInfo.Arguments = args;
156 | binding_process.StartInfo.UseShellExecute = false;
157 | try
158 | {
159 | binding_process.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(run_exe);
160 | }
161 | catch (Exception)
162 | {
163 | binding_process.StartInfo.WorkingDirectory = "./";
164 | }
165 | try
166 | {
167 | start_delay = Int32.Parse(sdelay) * 1000;
168 | if (start_delay < 0) start_delay *= -1;
169 | }
170 | catch (FormatException)
171 | {
172 | start_delay = 1000;
173 | }
174 | restarter = mode;
175 |
176 | PC.process_name = trigger_name;
177 | PC.cb_up = trigger_up;
178 | PC.cb_down = trigger_down;
179 | if (PC.get_number_of_process() > 0 && is_enable.Value == true)
180 | {
181 | start();
182 | }
183 | else
184 | {
185 | status.Value = "Waiting Trigger Process...";
186 | }
187 | }
188 | public void load_config(serialize_objects obj)
189 | {
190 | setup(obj.config_name, obj.trigger_process, obj.bind_process, obj.args, (obj.start_delay / 1000).ToString(), obj.restarter);
191 | is_enable.Value = true;
192 | }
193 |
194 | private void trigger_up(int pnum)
195 | {
196 | if (pnum == 1 && is_enable.Value == true)
197 | {
198 | start();
199 | }
200 | }
201 | private void trigger_down(int pnum)
202 | {
203 | if (pnum == 0 && status.Value == "Running")
204 | {
205 | try
206 | {
207 | binding_process.Kill();
208 | status.Value = "Exited";
209 | }
210 | catch (Exception e)
211 | {
212 | status.Value = e.Message;
213 | return;
214 | }
215 | }
216 | else
217 | {
218 | status.Value = "Waiting Trigger Process...";
219 | }
220 | }
221 | public async void start()
222 | {
223 | bool success = false;
224 | try
225 | {
226 | status.Value = "Waiting Startup Delay";
227 | await Task.Delay(start_delay);
228 | if (status.Value == "Waiting Startup Delay") success = binding_process.Start();
229 | else return;
230 | }
231 | catch (Exception e)
232 | {
233 | status.Value = e.Message;
234 | return;
235 | }
236 | if (success) status.Value = "Running";
237 | else
238 | {
239 | var p = System.Diagnostics.Process.GetProcessesByName(binding_process.ProcessName);
240 | Console.WriteLine($"Process:{p.Length}");
241 | if (p.Length > 0) status.Value = "Reused a process";
242 | else status.Value = "Error occured";
243 | }
244 | }
245 |
246 | private void proc_Exited(object sender, EventArgs e)
247 | {
248 | if (binding_process.ExitCode != 0)
249 | {
250 | status.Value = $"Fault Detected:{binding_process.ExitCode}";
251 | if (is_enable.Value == true && (restarter == RESTART_POLICY.ON_FAILUER || restarter == RESTART_POLICY.ALWAYS) && PC.get_number_of_process() != 0)
252 | {
253 | start();
254 | }
255 | }
256 | else
257 | {
258 | status.Value = "Exited";
259 | if (is_enable.Value == true && restarter == RESTART_POLICY.ALWAYS && PC.get_number_of_process() != 0)
260 | {
261 | start();
262 | }
263 | }
264 | }
265 | public serialize_objects serialize()
266 | {
267 | var sobj = new serialize_objects();
268 | sobj.is_enable = is_enable.Value;
269 | sobj.config_name = config_name.Value;
270 | sobj.status = status.Value;
271 | sobj.trigger_process = trigger_name;
272 | sobj.bind_process = binding_process.StartInfo.FileName;
273 | sobj.args = binding_process.StartInfo.Arguments;
274 | sobj.start_delay = start_delay;
275 | sobj.restarter = restarter;
276 | return sobj;
277 | }
278 |
279 | ///
280 | /// Releases the unmanaged resources and disposes of unmanaged resources used by the .
281 | ///
282 | public void Dispose()
283 | {
284 | Dispose(true);
285 | }
286 |
287 | ///
288 | /// Releases the unmanaged resources used by the and optionally disposes of the managed resources.
289 | ///
290 | /// true to release both managed and unmanaged resources; false to releases only unmanaged resources.
291 | protected virtual void Dispose(bool disposing)
292 | {
293 | if (_disposed)
294 | {
295 | return;
296 | }
297 |
298 | if (disposing)
299 | {
300 | //dispose managed resources
301 | PC.stop();
302 | is_enable?.Dispose();
303 | config_name?.Dispose();
304 | status?.Dispose();
305 | binding_process?.Dispose();
306 | PC?.Dispose();
307 | }
308 |
309 | _disposed = true;
310 | }
311 | }
312 | }
313 |
--------------------------------------------------------------------------------
/app_binder/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 | // アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
8 | // アセンブリに関連付けられている情報を変更するには、
9 | // これらの属性値を変更してください。
10 | [assembly: AssemblyTitle("AppBinder")]
11 | [assembly: AssemblyDescription("")]
12 | [assembly: AssemblyConfiguration("")]
13 | [assembly: AssemblyCompany("@tenteeeee_vrc")]
14 | [assembly: AssemblyProduct("AppBinder")]
15 | [assembly: AssemblyCopyright("Copyright © 2020")]
16 | [assembly: AssemblyTrademark("")]
17 | [assembly: AssemblyCulture("")]
18 |
19 | // ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから
20 | // 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、
21 | // その型の ComVisible 属性を true に設定してください。
22 | [assembly: ComVisible(false)]
23 |
24 | //ローカライズ可能なアプリケーションのビルドを開始するには、
25 | //.csproj ファイルの CultureYouAreCodingWith を
26 | // 内部で設定します。たとえば、
27 | //ソース ファイルで英語を使用している場合、 を en-US に設定します。次に、
28 | //下の NeutralResourceLanguage 属性のコメントを解除します。下の行の "en-US" を
29 | //プロジェクト ファイルの UICulture 設定と一致するよう更新します。
30 |
31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32 |
33 |
34 | [assembly: ThemeInfo(
35 | ResourceDictionaryLocation.None, //テーマ固有のリソース ディクショナリが置かれている場所
36 | //(リソースがページ、
37 | // またはアプリケーション リソース ディクショナリに見つからない場合に使用されます)
38 | ResourceDictionaryLocation.SourceAssembly //汎用リソース ディクショナリが置かれている場所
39 | //(リソースがページ、
40 | //アプリケーション、またはいずれのテーマ固有のリソース ディクショナリにも見つからない場合に使用されます)
41 | )]
42 |
43 |
44 | // アセンブリのバージョン情報は次の 4 つの値で構成されています:
45 | //
46 | // メジャー バージョン
47 | // マイナー バージョン
48 | // ビルド番号
49 | // リビジョン
50 | //
51 | // すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます
52 | // 既定値にすることができます:
53 | // [assembly: AssemblyVersion("1.0.*")]
54 | [assembly: AssemblyVersion("1.0.0.0")]
55 | [assembly: AssemblyFileVersion("1.0.0.0")]
56 |
--------------------------------------------------------------------------------
/app_binder/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // このコードはツールによって生成されました。
4 | // ランタイム バージョン:4.0.30319.42000
5 | //
6 | // このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
7 | // コードが再生成されるときに損失したりします。
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace AppBinder.Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
17 | ///
18 | // このクラスは StronglyTypedResourceBuilder クラスが ResGen
19 | // または Visual Studio のようなツールを使用して自動生成されました。
20 | // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
21 | // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.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 | /// このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。
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("AppBinder.Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// すべてについて、現在のスレッドの CurrentUICulture プロパティをオーバーライドします
51 | /// 現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
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 |
--------------------------------------------------------------------------------
/app_binder/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 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/app_binder/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // このコードはツールによって生成されました。
4 | // ランタイム バージョン:4.0.30319.42000
5 | //
6 | // このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
7 | // コードが再生成されるときに損失したりします。
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace AppBinder.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.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 |
--------------------------------------------------------------------------------
/app_binder/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app_binder/Properties/app.manifest:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
48 |
55 |
56 |
70 |
--------------------------------------------------------------------------------
/app_binder/app_binder.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {BEA3B239-523E-4DC8-8C84-DBA143EEFA21}
8 | WinExe
9 | AppBinder
10 | AppBinder
11 | v4.7.2
12 | 512
13 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
14 | 4
15 | true
16 | true
17 |
18 |
19 | false
20 | publish\
21 | true
22 | Disk
23 | false
24 | Foreground
25 | 7
26 | Days
27 | false
28 | false
29 | true
30 | 0
31 | 0.1.0.0
32 | false
33 | true
34 | true
35 |
36 |
37 | AnyCPU
38 | true
39 | full
40 | false
41 | bin\Debug\
42 | DEBUG;TRACE
43 | prompt
44 | 4
45 |
46 |
47 | AnyCPU
48 | none
49 | true
50 | bin\Release\
51 | TRACE
52 | prompt
53 | 4
54 |
55 |
56 | ACCD565559EB417939C1AEB206A0F251D60FA8DA
57 |
58 |
59 | app_binder_1_TemporaryKey.pfx
60 |
61 |
62 | false
63 |
64 |
65 | LocalIntranet
66 |
67 |
68 | Properties\app.manifest
69 |
70 |
71 | false
72 |
73 |
74 | StartUpCode.StartUp
75 |
76 |
77 |
78 | ..\packages\ControlzEx.4.3.0\lib\net462\ControlzEx.dll
79 |
80 |
81 | ..\packages\MahApps.Metro.2.1.0\lib\net47\MahApps.Metro.dll
82 |
83 |
84 | ..\packages\MaterialDesignColors.1.2.6\lib\net45\MaterialDesignColors.dll
85 |
86 |
87 | ..\packages\MaterialDesignThemes.3.1.3\lib\net45\MaterialDesignThemes.Wpf.dll
88 |
89 |
90 | ..\packages\Microsoft.Xaml.Behaviors.Wpf.1.1.19\lib\net45\Microsoft.Xaml.Behaviors.dll
91 |
92 |
93 | ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll
94 |
95 |
96 | ..\packages\ReactiveProperty.7.1.0\lib\netstandard2.0\ReactiveProperty.dll
97 |
98 |
99 | ..\packages\ReactiveProperty.Core.7.1.0\lib\netstandard2.0\ReactiveProperty.Core.dll
100 |
101 |
102 |
103 | ..\packages\System.ComponentModel.Annotations.4.7.0\lib\net461\System.ComponentModel.Annotations.dll
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 | ..\packages\System.Reactive.4.4.1\lib\net46\System.Reactive.dll
112 |
113 |
114 |
115 | ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 | 4.0
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 | MSBuild:Compile
137 | Designer
138 |
139 |
140 |
141 |
142 | Designer
143 | MSBuild:Compile
144 |
145 |
146 | MSBuild:Compile
147 | Designer
148 |
149 |
150 | App.xaml
151 | Code
152 |
153 |
154 | config_window.xaml
155 |
156 |
157 | MainWindow.xaml
158 | Code
159 |
160 |
161 |
162 |
163 | Component
164 |
165 |
166 | NotifyIconWrapper.cs
167 |
168 |
169 | Code
170 |
171 |
172 | True
173 | True
174 | Resources.resx
175 |
176 |
177 | True
178 | Settings.settings
179 | True
180 |
181 |
182 | NotifyIconWrapper.cs
183 |
184 |
185 | ResXFileCodeGenerator
186 | Resources.Designer.cs
187 |
188 |
189 |
190 |
191 |
192 |
193 | SettingsSingleFileGenerator
194 | Settings.Designer.cs
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 | False
203 | Microsoft .NET Framework 4.7.2 %28x86 および x64%29
204 | true
205 |
206 |
207 | False
208 | .NET Framework 3.5 SP1
209 | false
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 | %(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)
220 |
221 |
222 |
223 |
224 |
225 |
226 | このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。
227 |
228 |
229 |
230 |
--------------------------------------------------------------------------------
/app_binder/appbinder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TenteEEEE/app_binder/7abd778bda1a4b2e3ac7f453b701275ead62053d/app_binder/appbinder.png
--------------------------------------------------------------------------------
/app_binder/appbinder_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TenteEEEE/app_binder/7abd778bda1a4b2e3ac7f453b701275ead62053d/app_binder/appbinder_logo.png
--------------------------------------------------------------------------------
/app_binder/config_window.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app_binder/config_window.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 | using Microsoft.Win32;
3 | using MahApps.Metro.Controls;
4 |
5 | namespace AppBinder
6 | {
7 | public partial class config_window : MetroWindow
8 | {
9 | int config_index;
10 | public config_window()
11 | {
12 | InitializeComponent();
13 | textBox_name.Text = $"Config{((MainWindow)Application.Current.MainWindow).configs.Count + 1}";
14 | }
15 |
16 | public void load_config(serialize_objects obj, int index)
17 | {
18 | button_done.Visibility = Visibility.Hidden;
19 | button_modify.Visibility = Visibility.Visible;
20 | textBox_name.Text = obj.config_name;
21 | textBox_trigger.Text = obj.trigger_process;
22 | textBox_start.Text = obj.bind_process;
23 | textBox_args.Text = obj.args;
24 | textBox_delay.Text = (obj.start_delay / 1000).ToString();
25 | set_restart_radio_button(obj.restarter);
26 | config_index = index;
27 | }
28 |
29 | private void button_triggerbrowse_Click(object sender, RoutedEventArgs e)
30 | {
31 | var dialog = new OpenFileDialog();
32 | dialog.Filter = "Executable file(*.exe)|*.exe";
33 | if (dialog.ShowDialog() == true)
34 | {
35 | textBox_trigger.Text = dialog.FileName;
36 | }
37 | }
38 |
39 | private void button_startbrowse_Click(object sender, RoutedEventArgs e)
40 | {
41 | var dialog = new OpenFileDialog();
42 | dialog.Filter = "Executable file(*.exe)|*.exe";
43 | if (dialog.ShowDialog() == true)
44 | {
45 | textBox_start.Text = dialog.FileName;
46 | }
47 | }
48 | private void set_restart_radio_button(RESTART_POLICY p)
49 | {
50 | switch (p)
51 | {
52 | case (RESTART_POLICY.NEVER):
53 | radioButton_never.IsChecked = true;
54 | break;
55 | case (RESTART_POLICY.ON_FAILUER):
56 | radioButton_failure.IsChecked = true;
57 | break;
58 | case (RESTART_POLICY.ALWAYS):
59 | radioButton_always.IsChecked = true;
60 | break;
61 | }
62 | }
63 | private RESTART_POLICY check_restart_policy()
64 | {
65 | if (radioButton_never.IsChecked == true) return RESTART_POLICY.NEVER;
66 | else if (radioButton_failure.IsChecked == true) return RESTART_POLICY.ON_FAILUER;
67 | else return RESTART_POLICY.ALWAYS;
68 | }
69 | private void button_done_Click(object sender, RoutedEventArgs e)
70 | {
71 | var config = new ProcessRunner();
72 | config.setup(textBox_name.Text, textBox_trigger.Text, textBox_start.Text, textBox_args.Text, textBox_delay.Text, check_restart_policy());
73 | config.is_enable.Value = true;
74 | ((MainWindow)Application.Current.MainWindow).configs.Add(config);
75 | this.Close();
76 | }
77 |
78 | private void button_modify_Click(object sender, RoutedEventArgs e)
79 | {
80 | var config = new ProcessRunner();
81 | config.setup(textBox_name.Text, textBox_trigger.Text, textBox_start.Text, textBox_args.Text, textBox_delay.Text, check_restart_policy());
82 | config.is_enable.Value = true;
83 | ((MainWindow)Application.Current.MainWindow).configs[config_index].Dispose();
84 | ((MainWindow)Application.Current.MainWindow).configs[config_index] = config;
85 | this.Close();
86 | }
87 | }
88 |
89 | }
90 |
--------------------------------------------------------------------------------
/app_binder/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/app_binder/startup.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using System.Reflection;
7 | using System.IO;
8 | using AppBinder;
9 |
10 | namespace StartUpCode
11 | {
12 | public class StartUp
13 | {
14 | [STAThread]
15 | public static void Main()
16 | {
17 | AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
18 |
19 | App.Main(); // Run WPF startup code.
20 | }
21 |
22 | private static Assembly OnResolveAssembly(object sender, ResolveEventArgs e)
23 | {
24 | var thisAssembly = Assembly.GetExecutingAssembly();
25 |
26 | // Get the Name of the AssemblyFile
27 | var assemblyName = new AssemblyName(e.Name);
28 | var dllName = assemblyName.Name + ".dll";
29 |
30 | // Load from Embedded Resources - This function is not called if the Assembly is already
31 | // in the same folder as the app.
32 | var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(dllName));
33 | if (resources.Any())
34 | {
35 |
36 | // 99% of cases will only have one matching item, but if you don't,
37 | // you will have to change the logic to handle those cases.
38 | var resourceName = resources.First();
39 | using (var stream = thisAssembly.GetManifestResourceStream(resourceName))
40 | {
41 | if (stream == null) return null;
42 | var block = new byte[stream.Length];
43 |
44 | // Safely try to load the assembly.
45 | try
46 | {
47 | stream.Read(block, 0, block.Length);
48 | return Assembly.Load(block);
49 | }
50 | catch (IOException)
51 | {
52 | return null;
53 | }
54 | catch (BadImageFormatException)
55 | {
56 | return null;
57 | }
58 | }
59 | }
60 | // in the case the resource doesn't exist, return null.
61 | return null;
62 | }
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | [English](https://github.com/TenteEEEE/app_binder?#AppBinder)
2 | # AppBinderとは
3 |
4 |
5 | AppBinderはアプリケーション間の拘束関係(バインディング)を作るアプリです。
6 | アプリケーションバインディングとは「あるプログラムが起動したらあれを起動する」のような関係のことです。
7 | このプログラムの目的は単なるアプリケーションランチャーではなく、**バインドされたアプリの障害検知/修復および永続化を実現すること**です。
8 |
9 | ## アプリケーションバインディングの例
10 | ### 電卓を起動したらメモ帳も開きたい
11 | Calculatorとnotepad(C:\Windows\System32\notepad.exe)をバインディングする
12 | 
13 |
14 | ### ついでにExcelも開きたい
15 | Excel.exeとCalculatorのバインディングを追加する
16 | 
17 |
18 | ### あるアプリは必ず存在してほしい(永続化)
19 | リスタートポリシーでは"on_failure(exit codeが0以外)"と"always"が選べます
20 | 
21 |
22 | ## 既知の問題/将来性
23 | ### トリガーがうまく動いていない
24 | 実行するトリガープログラムのプロセス名が拡張子.exeを除いたものと一致しない場合、うまく動きません。
25 | Trigger EXE/Processの部分で適切なプロセス名を入力してください。
26 |
27 | ### トリガープロセスを終了したけどバインドされたプログラムが終了しない
28 | おそらくExit codeが0以外で終了しています。
29 | 一般的には正常終了では0がexit codeとなりますが、正常終了においても-1を返すプログラムがあります。
30 | 自身で書いたプログラムの場合は修正してください。
31 | そうでない場合、自分がいつか除外するexit codeのオプションを実装する気になったときになんとかします。
32 |
33 | ### 双方向バインディング
34 | 逆方向のバインディングを追加すれば良いのですが、ちょっと面倒です。
35 | 必要な人が多そうならちゃんと考えるかも。
36 |
37 | # AppBinder
38 |
39 |
40 | AppBinder is an application-binding program.
41 | This is not a general application launcher.
42 | It acheves *fault detection/recover and application persistence*.
43 |
44 | ## What is Application-Binding?
45 | ### I need a notepad when running calculators
46 | Bind Calculator.exe and notepad.exe
47 | 
48 |
49 | ### I need Excel too
50 | We just bind a Calculator and Excel.exe
51 | 
52 |
53 | ### An application must be persistent
54 | It supports restart policy such as "on failure" and "always".
55 | 
56 |
57 | ## Something went wrong?
58 | ### Trigger does not work
59 | If a process name of "something.exe" is different from "something", it does not work now.
60 | Please set the correct process name on the "Trigger EXE/Process" manually.
61 |
62 | ### I killed a trigger process but binding program is still running
63 | Probably, the trigger program's exit code is non-zero value(something fault).
64 | If it is your application, please modify the return number.
65 | When I get a motivation to make "exception exit-code", it will be better.
66 |
67 | ### Bidirectional Binding
68 | I am considering this.
69 | It works when we add an opposite binding as a new config now, but it is not beautiful.
70 |
--------------------------------------------------------------------------------