PageRenderTime 37ms CodeModel.GetById 7ms RepoModel.GetById 1ms app.codeStats 0ms

/tags/v.0.2/Form1.cs

#
C# | 520 lines | 351 code | 137 blank | 32 comment | 55 complexity | cea4c3ba607651de19512a0a8fd81624 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Configuration;
  9. using BalloonCS;
  10. namespace VirtualScreenMaximizer
  11. {
  12. public partial class Form1 : Form
  13. {
  14. Maximizer.ConfiguredKey maxKey;
  15. Maximizer.ConfiguredKey resKey;
  16. //List<MockScreen> confScreens = null;
  17. ConfiguredMockScreens configuredMockScreens = null;
  18. System.Configuration.Configuration config = null;
  19. public Form1()
  20. {
  21. InitializeComponent();
  22. loadSettings();
  23. }
  24. private void loadSettings()
  25. {
  26. config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
  27. if (config.AppSettings.Settings["maximize"] != null)
  28. {
  29. string maxS = config.AppSettings.Settings["maximize"].Value;
  30. if (maxS != null)
  31. {
  32. string[] maxP = maxS.Split(new char[1] { ' ' }, 2);
  33. if (maxP.Length > 0)
  34. {
  35. if (maxP[0].Length >= 5)
  36. {
  37. maxKey = new Maximizer.ConfiguredKey(maxP[0][0] == '1', maxP[0][1] == '1', maxP[0][2] == '1', Convert.ToInt32(maxP[0].Substring(3)));
  38. }
  39. if (maxP.Length > 1)
  40. {
  41. textBoxMaxHK.Text = maxP[1];
  42. }
  43. }
  44. }
  45. }
  46. if (config.AppSettings.Settings["restore"] != null)
  47. {
  48. string resS = config.AppSettings.Settings["restore"].Value;
  49. if (resS != null)
  50. {
  51. string[] resP = resS.Split(new char[1] { ' ' }, 2);
  52. if (resP.Length > 0)
  53. {
  54. if (resP[0].Length >= 5)
  55. {
  56. resKey = new Maximizer.ConfiguredKey(resP[0][0] == '1', resP[0][1] == '1', resP[0][2] == '1', Convert.ToInt32(resP[0].Substring(3)));
  57. }
  58. if (resP.Length > 1)
  59. {
  60. textBoxResHK.Text = resP[1];
  61. }
  62. }
  63. }
  64. }
  65. configuredMockScreens = new ConfiguredMockScreens();
  66. if (config.AppSettings.Settings["NumberOfConfiguredScreens"] != null)
  67. {
  68. string nrS = config.AppSettings.Settings["NumberOfConfiguredScreens"].Value;
  69. //config.AppSettings.Settings.Add("ScreenDeviceName" + i, ms.DeviceName);
  70. //config.AppSettings.Settings.Add("ScreenVertical" + i, ms.Vertical?"true":"false");
  71. //config.AppSettings.Settings.Add("ScreenHorizontal" + i, ms.Horizontal ? "true" : "false");
  72. if (nrS != null)
  73. {
  74. int nrSc = Convert.ToInt32(nrS);
  75. for (int i = 0; i < nrSc; i++)
  76. {
  77. //config.AppSettings.Settings ["ScreenDeviceName" + i].Value;
  78. MockScreen ms = new MockScreen(config.AppSettings.Settings["ScreenDeviceName" + i].Value);
  79. ms.Vertical = (config.AppSettings.Settings["ScreenVertical" + i].Value.ToLower() == "true");
  80. ms.Horizontal = (config.AppSettings.Settings["ScreenHorizontal" + i].Value.ToLower() == "true");
  81. configuredMockScreens.Add(ms.DeviceName.ToString(), ms);
  82. Console.WriteLine(ms.Horizontal);
  83. }
  84. }
  85. }
  86. if (config.AppSettings.Settings["UseWorkingArea"] != null)
  87. {
  88. bool useWA = false;
  89. Boolean.TryParse(config.AppSettings.Settings["UseWorkingArea"].Value, out useWA);
  90. configuredMockScreens.UseWorkingArea = useWA;
  91. UseWorkingAreaCheckbox.Checked = configuredMockScreens.UseWorkingArea;
  92. }
  93. }
  94. protected override void WndProc(ref Message m)
  95. {
  96. if (m.Msg == 0x312) //WM_HOTKEY
  97. {
  98. Maximizer.ProcessHK(m.WParam, configuredMockScreens);
  99. return;
  100. }
  101. base.WndProc(ref m);
  102. }
  103. private void Form1_Load(object sender, EventArgs e)
  104. {
  105. Init();
  106. ComputeScreens();
  107. }
  108. private void textBoxMaxHK_KeyDown(object sender, KeyEventArgs e)
  109. {
  110. if (e.Modifiers != Keys.None)
  111. textBoxMaxHK.Text = e.Modifiers + " " + e.KeyCode;
  112. else
  113. textBoxMaxHK.Text = e.KeyCode.ToString();
  114. textBoxMaxHK.Tag = e;
  115. }
  116. private void textBoxResHK_KeyDown(object sender, KeyEventArgs e)
  117. {
  118. if (e.Modifiers != Keys.None)
  119. textBoxResHK.Text = e.Modifiers + " " + e.KeyCode;
  120. else
  121. textBoxResHK.Text = e.KeyCode.ToString();
  122. textBoxResHK.Tag = e;
  123. }
  124. private void buttonSave_Click(object sender, EventArgs e)
  125. {
  126. saveSettings();
  127. //Close();
  128. }
  129. private void saveSettings()
  130. {
  131. config.AppSettings.Settings.Clear();
  132. //config.AppSettings.Settings.Remove("maximize");
  133. KeyEventArgs max = (KeyEventArgs)textBoxMaxHK.Tag;
  134. max = new KeyEventArgs(Keys.F11 | Keys.Control | Keys.Shift); textBoxMaxHK.Text = "Shift, Control F11";
  135. if (max != null)
  136. {
  137. string maxS = "";
  138. maxS += max.Alt ? "1" : "0";
  139. maxS += max.Control ? "1" : "0";
  140. maxS += max.Shift ? "1" : "0";
  141. maxS += max.KeyValue;
  142. maxS += " " + textBoxMaxHK.Text;
  143. config.AppSettings.Settings.Add("maximize", maxS);
  144. maxKey = new Maximizer.ConfiguredKey(max.Alt, max.Control, max.Shift, max.KeyValue);
  145. }
  146. //config.AppSettings.Settings.Remove("restore");
  147. KeyEventArgs res = (KeyEventArgs)textBoxResHK.Tag;
  148. res = new KeyEventArgs(Keys.F9 | Keys.Control | Keys.Shift);textBoxResHK.Text="Shift, Control F9";
  149. if (res != null)
  150. {
  151. string resS = "";
  152. resS += res.Alt ? "1" : "0";
  153. resS += res.Control ? "1" : "0";
  154. resS += res.Shift ? "1" : "0";
  155. resS += res.KeyValue;
  156. resS += " " + textBoxResHK.Text;
  157. config.AppSettings.Settings.Add("restore", resS);
  158. resKey = new Maximizer.ConfiguredKey(res.Alt, res.Control, res.Shift, res.KeyValue);
  159. }
  160. //config.AppSettings.Settings.Remove("NumberOfConfiguredScreens");
  161. config.AppSettings.Settings.Add("NumberOfConfiguredScreens", configuredMockScreens.Count.ToString());
  162. int i = 0;
  163. foreach (KeyValuePair<string, MockScreen> kvp in configuredMockScreens)
  164. {
  165. MockScreen ms = kvp.Value;
  166. config.AppSettings.Settings.Add("ScreenDeviceName" + i, ms.DeviceName);
  167. config.AppSettings.Settings.Add("ScreenVertical" + i, ms.Vertical ? "true" : "false");
  168. config.AppSettings.Settings.Add("ScreenHorizontal" + i, ms.Horizontal ? "true" : "false");
  169. i++;
  170. }
  171. config.AppSettings.Settings.Add("UseWorkingArea", UseWorkingAreaCheckbox.Checked.ToString());
  172. config.Save(ConfigurationSaveMode.Minimal, true);
  173. Init();
  174. this.Hide();
  175. }
  176. private void configToolStripMenuItem_Click(object sender, EventArgs e)
  177. {
  178. this.Show();
  179. }
  180. private void quitToolStripMenuItem_Click(object sender, EventArgs e)
  181. {
  182. Application.ExitThread();
  183. }
  184. private void Form1_Shown(object sender, EventArgs e)
  185. {
  186. this.Hide();
  187. }
  188. public void Init()
  189. {
  190. Maximizer.RegisterHK(Handle, GetHashCode(), (Keys)maxKey.KeyCode,
  191. (maxKey.Alt ? Maximizer.MOD_ALT : 0) |
  192. (maxKey.Control ? Maximizer.MOD_CONTROL : 0) |
  193. (maxKey.Shift ? Maximizer.MOD_SHIFT : 0), "FullScreen");
  194. Maximizer.RegisterHK(Handle, GetHashCode(), (Keys)resKey.KeyCode,
  195. (resKey.Alt ? Maximizer.MOD_ALT : 0) |
  196. (resKey.Control ? Maximizer.MOD_CONTROL : 0) |
  197. (resKey.Shift ? Maximizer.MOD_SHIFT : 0), "RestoreOriginal");
  198. }
  199. private void ComputeScreens()
  200. {
  201. /*List<MockScreen> confScreens = new List<MockScreen>();
  202. confScreens.Add(new MockScreen(System.Windows.Forms.Screen.PrimaryScreen));
  203. confScreens.Add(new MockScreen(32, new Rectangle(-500, -100, 500, 400), "s0", false, new Rectangle(-500, -1050, 500, 400)));
  204. confScreens.Add(new MockScreen(32, new Rectangle(1280, 50, 500, 400), "s1", false, new Rectangle(-500, -1050, 500, 400)));
  205. /* List<MockScreen> confScreens = new List<MockScreen>();
  206. foreach (Screen cMockScreen in System.Windows.Forms.Screen.AllScreens)
  207. {
  208. confScreens.Add(new MockScreen(cMockScreen));
  209. } */
  210. // confScreens = null;
  211. /* if (confScreens == null)
  212. {
  213. confScreens = new Dictionary<string, MockScreen>();
  214. confScreens.Add(System.Windows.Forms.Screen.PrimaryScreen.DeviceName, new MockScreen(System.Windows.Forms.Screen.PrimaryScreen));
  215. confScreens.Add("s0", new MockScreen(32, new Rectangle(-500, -100, 500, 400), "s0", false, new Rectangle(-500, -1050, 500, 400)));
  216. confScreens.Add("s1", new MockScreen(32, new Rectangle(1280, 50, 500, 400), "s1", false, new Rectangle(-500, -1050, 500, 400)));
  217. confScreens.Add("s2", new MockScreen(32, new Rectangle(1980, 50, 500, 400), "s2", false, new Rectangle(-500, -1050, 500, 400)));
  218. }*/
  219. bool forceSet = (configuredMockScreens.Count == 0);
  220. foreach (Screen s in System.Windows.Forms.Screen.AllScreens)
  221. {
  222. string sDeviceName = Maximizer.neuterDeviceName(s.DeviceName);
  223. MockScreen ms = new MockScreen(s);
  224. if (configuredMockScreens.ContainsKey(Maximizer.neuterDeviceName(sDeviceName)))
  225. {
  226. ms.Vertical = forceSet || configuredMockScreens[sDeviceName].Vertical;
  227. ms.Horizontal = forceSet || configuredMockScreens[sDeviceName].Horizontal;
  228. configuredMockScreens[sDeviceName] = ms;
  229. }
  230. else
  231. {
  232. configuredMockScreens.Add(ms.DeviceName, ms);
  233. configuredMockScreens[ms.DeviceName].Horizontal |= forceSet;
  234. configuredMockScreens[ms.DeviceName].Vertical |= forceSet;
  235. }
  236. }
  237. List<string> mockScreensToRemove = new List<string>();
  238. foreach (KeyValuePair<string, MockScreen> kvp in configuredMockScreens)
  239. {
  240. if (kvp.Value.Incomplete)
  241. {
  242. mockScreensToRemove.Add(kvp.Value.DeviceName);
  243. }
  244. }
  245. foreach (string s in mockScreensToRemove)
  246. {
  247. configuredMockScreens.Remove(s);
  248. }
  249. Rectangle wholeVirtualScreenBounds = Rectangle.Empty;
  250. foreach (KeyValuePair<string, MockScreen> s in configuredMockScreens)
  251. {
  252. wholeVirtualScreenBounds = Rectangle.Union(s.Value.Bounds, wholeVirtualScreenBounds);
  253. }
  254. int barWidth = Math.Max(5, Width / 30);
  255. int offset = 5;
  256. float fw = ((float)wholeVirtualScreenBounds.Width / (screensPanel.Width - 2 * offset));
  257. this.screensPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
  258. this.Height = screensPanel.Top + Height - screensPanel.Bottom + (int)((float)wholeVirtualScreenBounds.Height / fw) + 2 * offset + 2 * barWidth;
  259. screensPanel.Height = (int)((float)wholeVirtualScreenBounds.Height / fw) + 2 * offset + 2 * barWidth;
  260. this.screensPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
  261. screensPanel.Controls.Clear();
  262. foreach (KeyValuePair<string, MockScreen> kvp in configuredMockScreens)
  263. {
  264. MockScreen cMockScreen = kvp.Value;
  265. Point controlPosition = new Point(
  266. offset + (int)((float)cMockScreen.Bounds.Left / fw - (float)wholeVirtualScreenBounds.Left / fw),
  267. offset + (int)((float)cMockScreen.Bounds.Top / fw - (float)wholeVirtualScreenBounds.Top / fw)
  268. );
  269. Label screenLabel = new Label();
  270. screenLabel.TextAlign = ContentAlignment.MiddleCenter;
  271. screenLabel.BorderStyle = BorderStyle.FixedSingle;
  272. screenLabel.BackColor = SystemColors.ControlLightLight;
  273. screenLabel.AutoSize = false;
  274. screenLabel.Size = new SizeF(cMockScreen.Bounds.Width / fw, cMockScreen.Bounds.Height / fw).ToSize();
  275. screenLabel.Location = controlPosition;
  276. screenLabel.Text = cMockScreen.DeviceName + "\n" + cMockScreen.Bounds.Width + "x" + cMockScreen.Bounds.Height;
  277. screenLabel.Tag = cMockScreen;
  278. screenLabel.Name = "ScreenLabel";
  279. //toolTip1.SetToolTip(screenLabel, "Toggle the surrounding buttons to select the window span");
  280. CheckBox horizontalCheckbox = new CheckBox();
  281. horizontalCheckbox.Appearance = Appearance.Button;
  282. horizontalCheckbox.AutoSize = false;
  283. horizontalCheckbox.Size = new SizeF(cMockScreen.Bounds.Width / fw, barWidth).ToSize();
  284. horizontalCheckbox.Location = controlPosition;
  285. horizontalCheckbox.Checked = cMockScreen.Horizontal;
  286. horizontalCheckbox.Tag = cMockScreen;
  287. horizontalCheckbox.Name = "HorizontalCheckbox";
  288. //toolTip1.SetToolTip(horizontalCheckbox, "Toggle to span the window to this screen on width");
  289. CheckBox verticalCheckbox = new CheckBox();
  290. verticalCheckbox.Appearance = Appearance.Button;
  291. verticalCheckbox.AutoSize = false;
  292. verticalCheckbox.Size = new SizeF(barWidth, cMockScreen.Bounds.Height / fw).ToSize();
  293. verticalCheckbox.Location = controlPosition;
  294. verticalCheckbox.Checked = cMockScreen.Vertical;
  295. verticalCheckbox.Tag = cMockScreen;
  296. verticalCheckbox.Name = "VerticalCheckbox";
  297. //toolTip1.SetToolTip(verticalCheckbox, "Toggle to span the window to this screen on height");
  298. horizontalCheckbox.CheckedChanged += new EventHandler(horizontalCheckbox_CheckedChanged);
  299. verticalCheckbox.CheckedChanged += new EventHandler(verticalCheckbox_CheckedChanged);
  300. screensPanel.Controls.Add(verticalCheckbox);
  301. screensPanel.Controls.Add(horizontalCheckbox);
  302. screensPanel.Controls.Add(screenLabel);
  303. }
  304. }
  305. void verticalCheckbox_CheckedChanged(object sender, EventArgs e)
  306. {
  307. ((MockScreen)(((CheckBox)sender).Tag)).Vertical = ((CheckBox)sender).Checked;
  308. }
  309. void horizontalCheckbox_CheckedChanged(object sender, EventArgs e)
  310. {
  311. ((MockScreen)(((CheckBox)sender).Tag)).Horizontal = ((CheckBox)sender).Checked;
  312. }
  313. private void Form1_ResizeEnd(object sender, EventArgs e)
  314. {
  315. ComputeScreens();
  316. }
  317. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  318. {
  319. saveSettings();
  320. e.Cancel = true;
  321. }
  322. private void toolStripMenuItem2_Click(object sender, EventArgs e)
  323. {
  324. new AboutBox().ShowDialog(this);
  325. }
  326. private void Form1_HelpRequested(object sender, HelpEventArgs hlpevent)
  327. {
  328. Control helpControl = this.GetChildAtPoint(PointToClient(hlpevent.MousePos));
  329. if (helpControl == null)
  330. {
  331. Console.WriteLine("");
  332. ShowHelp(this);
  333. return;
  334. }
  335. if (helpControl == screensPanel)
  336. {
  337. helpControl = screensPanel.GetChildAtPoint(screensPanel.PointToClient(hlpevent.MousePos));
  338. if (helpControl == null)
  339. return;
  340. }
  341. ShowHelp(helpControl);
  342. }
  343. private void ShowHelp(Control helpC)
  344. {
  345. if (mb == null)
  346. mb = new MessageBalloon(this);
  347. mb.Parent = helpC;
  348. mb.Align = BalloonAlignment.CenterMiddle;
  349. Console.WriteLine(helpC.Name);
  350. string helpText = global::VirtualScreenMaximizer.Properties.Resources.ResourceManager.GetString("help_" + helpC.Name);
  351. if (helpText == null)
  352. return;
  353. string[] helpTextSplit = helpText.Split(new char[1] { '|' }, 2);
  354. mb.TitleIcon = TooltipIcon.Info;
  355. mb.Title = helpTextSplit[0];
  356. mb.Text = helpTextSplit[1];
  357. mb.Show();
  358. }
  359. MessageBalloon mb = null;
  360. private void notifyIcon1_DoubleClick(object sender, EventArgs e)
  361. {
  362. if (Visible)
  363. {
  364. this.Hide();
  365. }
  366. else
  367. {
  368. this.Show();
  369. }
  370. }
  371. }
  372. public class ConfiguredMockScreens : Dictionary<string, MockScreen>
  373. {
  374. private bool useWorkingArea;
  375. public bool UseWorkingArea
  376. {
  377. get { return useWorkingArea; }
  378. set { useWorkingArea = value; }
  379. }
  380. }
  381. }