frm_Client.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Threading;
  9. using RemoteControlLib.Codes;
  10. namespace RemoteClient
  11. {
  12. //INCU客户端
  13. public partial class frm_Client : Form
  14. {
  15. /// <summary>
  16. /// 总控制端
  17. /// </summary>
  18. private Clients.Controlers GeneralControler;
  19. /// <summary>
  20. /// 当前选择的树形结点
  21. /// </summary>
  22. private TreeNode CurrentNode;
  23. /// <summary>
  24. /// 哈希表(Key=文件后缀名,value=图片列表的Key)
  25. /// 例如:后缀名A=exe,则imageKey[A]="exe",而imageKey[A]则是对应的文件图标Key值.
  26. /// </summary>
  27. private Hashtable imageKey;
  28. /// <summary>
  29. /// 是否开始截取远程屏幕
  30. /// </summary>
  31. private bool ScreenOpen;
  32. //初始化
  33. public frm_Client()
  34. {
  35. InitializeComponent();
  36. Initial();
  37. }
  38. /// <summary>
  39. /// 初始化
  40. /// </summary>
  41. private void Initial()
  42. {
  43. imageKey = new Hashtable();
  44. System.Collections.Specialized.StringCollection keyCol = iml_ExplorerImages.Images.Keys;
  45. for (int i = 0; i < keyCol.Count; i++)
  46. if (!imageKey.Contains(keyCol[i]))
  47. imageKey.Add(keyCol[i], keyCol[i]);
  48. //总控制端初始化
  49. GeneralControler = new Clients.Controlers(imageKey);
  50. GeneralControler.pic_Screen = pic_Screen;
  51. GeneralControler.ltv_HostExplorer = ltv_hostexplorer;
  52. GeneralControler.ltv_Log = ltv_Log;
  53. GeneralControler.ltv_MyExplorer = ltv_myexplorer;
  54. GeneralControler.rtb_Content = rtb_Content;
  55. GeneralControler.trv_HostView = trv_HostView;
  56. GeneralControler.txb_HostExploer = txt_hostexplorer;
  57. GeneralControler.txb_MyExplorer = txt_myexplorer;
  58. GeneralControler.lbl_Message = lbl_Display;
  59. //RemoteControlLib.Configure.Option option = new RemoteControlLib.Configure.Option();
  60. //RemoteControlLib.Configure.OptionFile optionFile = option.OptFile;
  61. //if (optionFile != null)
  62. //{
  63. // GeneralControler.UpdatedFile = optionFile.UpdatedFile;
  64. // GeneralControler.ServerVersion = optionFile.UpdatedVersion;
  65. //}
  66. //未开始截屏
  67. ScreenOpen = false;
  68. //默认截屏间隔时间(一秒),即截屏速度为中.
  69. ScreenTimer.Interval = 1000;
  70. 中MToolStripMenuItem.Checked = true;
  71. // this.ShowInTaskbar = false;
  72. }
  73. #region 建立连接
  74. //连接所有安装服务端的主机
  75. private void 所有主机AToolStripMenuItem_Click(object sender, EventArgs e)
  76. {
  77. ScreenTimer.Enabled = false;
  78. frm_ConnectAll Connection = new frm_ConnectAll();
  79. DialogResult result = Connection.ShowDialog();
  80. if (result == DialogResult.OK)
  81. {
  82. if (!GeneralControler.ConnectAll(Connection.StartIP, Connection.EndIP))
  83. MessageBox.Show("不能建立连接!");
  84. }
  85. }
  86. //与指定主机连接连接
  87. private void 指定主机SToolStripMenuItem_Click(object sender, EventArgs e)
  88. {
  89. ScreenTimer.Enabled = false;
  90. frm_Connection Connection = new frm_Connection();
  91. DialogResult result = Connection.ShowDialog();
  92. if (result == DialogResult.OK)
  93. {
  94. System.Net.IPAddress serverIP;
  95. try
  96. {
  97. serverIP = RemoteControlLib.Common.Network.ToIPAddress(Connection.ServerIP);
  98. }
  99. catch
  100. {
  101. MessageBox.Show("IP地址错误!", "IP地址错误", MessageBoxButtons.OK, MessageBoxIcon.Stop);
  102. return;
  103. }
  104. GeneralControler.BuiltControler(serverIP);
  105. }
  106. }
  107. //重新连接
  108. private void 重新连接RToolStripMenuItem_Click(object sender, EventArgs e)
  109. {
  110. ScreenTimer.Enabled = false;
  111. TreeNode tn = trv_HostView.SelectedNode;
  112. if (tn != null)
  113. {
  114. Thread thread = new Thread(new ParameterizedThreadStart(GeneralControler.ReBuilt));
  115. thread.Start(tn);
  116. }
  117. else
  118. MessageBox.Show("请选择树形视图的主机IP地址重试,或者移除它,然后再建立连接.");
  119. }
  120. #endregion
  121. #region 文件管理
  122. //打开本地电脑上的路径
  123. private void btn_myexplorer_Click(object sender, EventArgs e)
  124. {
  125. RemoteControlLib.Common.IO.OpenDirectory(txt_myexplorer.Text, ltv_myexplorer, imageKey);
  126. }
  127. //打开本地电脑上的路径
  128. private void ltv_myexplorer_DoubleClick(object sender, EventArgs e)
  129. {
  130. ListViewItem selectItem = null;
  131. BaseFile basefile = null;
  132. try
  133. {
  134. selectItem = ltv_myexplorer.FocusedItem;
  135. if (selectItem != null)
  136. {
  137. basefile = selectItem.Tag as BaseFile;
  138. if (basefile != null)
  139. if (basefile.Flag != FileFlag.File)
  140. {
  141. string path = (basefile.Flag == FileFlag.Directory ? basefile.Name : basefile.Name + @"\");
  142. lbl_Display.Text = path;
  143. RemoteControlLib.Common.IO.OpenDirectory(path, ltv_myexplorer, imageKey);
  144. txt_myexplorer.Text = path;
  145. }
  146. }
  147. else
  148. {
  149. MessageBox.Show(" 请选择一个文件夹!");
  150. }
  151. }
  152. catch
  153. {
  154. }
  155. }
  156. //获取本地电脑上文件的信息
  157. private void ltv_myexplorer_SelectedIndexChanged(object sender, EventArgs e)
  158. {
  159. if (ltv_myexplorer.FocusedItem != null)
  160. {
  161. BaseFile basefile = ltv_myexplorer.FocusedItem.Tag as BaseFile;
  162. if (basefile != null)
  163. if (basefile.Flag == FileFlag.Directory)
  164. lbl_Display.Text = basefile.Name;
  165. else if (basefile.Flag == FileFlag.File)
  166. lbl_Display.Text = RemoteControlLib.Common.IO.GetFileDetial(basefile.Name);
  167. }
  168. }
  169. //打开本地电脑上的路径
  170. private void txt_myexplorer_KeyDown(object sender, KeyEventArgs e)
  171. {
  172. if (e.KeyCode == Keys.Enter)
  173. RemoteControlLib.Common.IO.OpenDirectory(txt_myexplorer.Text, ltv_myexplorer, imageKey);
  174. }
  175. //打开本地电脑上的路径
  176. private void 打开OToolStripMenuItem2_Click(object sender, EventArgs e)
  177. {
  178. ltv_myexplorer_DoubleClick(sender, e);
  179. }
  180. //刷新本地电脑
  181. private void 刷新RtoolStripMenuItem_Click(object sender, EventArgs e)
  182. {
  183. btn_myexplorer_Click(sender, e);
  184. }
  185. //打开远程电脑上的路径
  186. private void 打开OToolStripMenuItem1_Click(object sender, EventArgs e)
  187. {
  188. lvs_hostexplorer_DoubleClick(sender, e);
  189. }
  190. //打开远程电脑上的路径
  191. private void btn_hostexplorer_Click(object sender, EventArgs e)
  192. {
  193. string path = txt_hostexplorer.Text;
  194. if (path != "")
  195. GeneralControler.GetDirectoryDetial(path);
  196. else
  197. GeneralControler.GetDiskDetial();
  198. }
  199. //打开远程电脑上的路径
  200. private void lvs_hostexplorer_DoubleClick(object sender, EventArgs e)
  201. {
  202. try
  203. {
  204. if (ltv_hostexplorer.FocusedItem != null)
  205. {
  206. BaseFile basefile = ltv_hostexplorer.FocusedItem.Tag as BaseFile;
  207. if (basefile != null)
  208. if (basefile.Flag != FileFlag.File)
  209. {
  210. string path = (basefile.Flag == FileFlag.Directory ? basefile.Name : basefile.Name + @"\");
  211. if (path != "")
  212. {
  213. lbl_Display.Text = path;
  214. GeneralControler.GetDirectoryDetial(path);
  215. txt_hostexplorer.Text = path;
  216. }
  217. else
  218. {
  219. GeneralControler.GetDiskDetial();
  220. lbl_Display.Text = "远程电脑的根目录";
  221. }
  222. }
  223. }
  224. else
  225. {
  226. MessageBox.Show(" 请选择一个文件夹!");
  227. }
  228. }
  229. catch { }
  230. }
  231. //打开远程电脑上的路径
  232. private void txt_hostexplorer_KeyDown(object sender, KeyEventArgs e)
  233. {
  234. if (e.KeyCode == Keys.Enter)
  235. btn_hostexplorer_Click(sender, e);
  236. }
  237. private void 刷新RToolStripMenuItem1_Click(object sender, EventArgs e)
  238. {
  239. btn_hostexplorer_Click(sender, e);
  240. }
  241. //获取远程电脑上文件的信息
  242. private void lvs_hostexplorer_SelectedIndexChanged(object sender, EventArgs e)
  243. {
  244. try
  245. {
  246. BaseFile basefile = ltv_hostexplorer.FocusedItem.Tag as BaseFile;
  247. if (basefile != null)
  248. if (basefile.Flag == FileFlag.File)
  249. GeneralControler.GetFileDetial(basefile.Name);
  250. else if (basefile.Flag == FileFlag.Directory)
  251. lbl_Display.Text = basefile.Name;
  252. }
  253. catch { }
  254. }
  255. //远程文件下载
  256. private void 下载DToolStripMenuItem_Click(object sender, EventArgs e)
  257. {
  258. try
  259. {
  260. if (ltv_hostexplorer.FocusedItem != null)
  261. {
  262. BaseFile basefile = ltv_hostexplorer.FocusedItem.Tag as BaseFile;
  263. if (basefile != null)
  264. if (basefile.Flag == FileFlag.File)
  265. {
  266. string savePath = ltv_myexplorer.Tag as string;
  267. if (savePath != null)
  268. {
  269. string fileName = RemoteControlLib.Common.IO.GetName(basefile.Name);
  270. savePath += (savePath.EndsWith(@"\") ? fileName : @"\" + fileName);
  271. if (savePath != "")
  272. {
  273. if (System.IO.File.Exists(savePath))
  274. {
  275. DialogResult result = MessageBox.Show("\t文件\'" + fileName + "\'已经存在!\n\t是否选择另外一个目录保存?", "选择另外一个目录保存", MessageBoxButtons.YesNo);
  276. if (result == DialogResult.Yes)
  277. {
  278. SaveFileDialog filechooser = new SaveFileDialog();
  279. filechooser.FileName = savePath;
  280. filechooser.Filter = "(" + RemoteControlLib.Common.IO.GetFileType(fileName) + ")|*." + RemoteControlLib.Common.IO.GetFileType(fileName);
  281. DialogResult saveResult = filechooser.ShowDialog();
  282. if (saveResult == DialogResult.OK)
  283. {
  284. savePath = filechooser.FileName;
  285. }
  286. }
  287. }
  288. if (savePath != null && savePath != "")
  289. GeneralControler.DownOrUpload(basefile.Name, savePath, true);
  290. }
  291. else
  292. MessageBox.Show("当前保存路径" + savePath + "无效!");
  293. }
  294. }
  295. else
  296. MessageBox.Show("只能下载文件");
  297. }
  298. else
  299. {
  300. MessageBox.Show(" 请选择一个文件下载!");
  301. }
  302. }
  303. catch { }
  304. }
  305. //上传本地文件到服务端
  306. private void 上传UToolStripMenuItem_Click(object sender, EventArgs e)
  307. {
  308. try
  309. {
  310. if (ltv_myexplorer.FocusedItem != null)
  311. {
  312. BaseFile basefile = ltv_myexplorer.FocusedItem.Tag as BaseFile;
  313. if (basefile != null)
  314. if (basefile.Flag == FileFlag.File)
  315. {
  316. string savePath = ltv_hostexplorer.Tag as string;
  317. if (savePath != null)
  318. if (savePath != "")
  319. {
  320. string fileName = RemoteControlLib.Common.IO.GetName(basefile.Name);
  321. savePath += (savePath.EndsWith(@"\") ? fileName : @"\" + fileName);
  322. GeneralControler.DownOrUpload(basefile.Name, savePath, false);
  323. }
  324. else
  325. MessageBox.Show("当前保存路径" + savePath + "无效!");
  326. }
  327. else
  328. MessageBox.Show("只能上传文件");
  329. }
  330. else
  331. {
  332. MessageBox.Show(" 请选择一个文件上传!");
  333. }
  334. }
  335. catch { }
  336. }
  337. #endregion
  338. #region 远程主机的鼠标控制
  339. private void pic_Screen_MouseDoubleClick(object sender, MouseEventArgs e)
  340. {
  341. if (ScreenOpen)
  342. GeneralControler.MouseDoubleClick(sender, e);
  343. }
  344. private void pic_Screen_MouseDown(object sender, MouseEventArgs e)
  345. {
  346. if (ScreenOpen)
  347. GeneralControler.MouseDown(sender, e);
  348. }
  349. private void pic_Screen_MouseMove(object sender, MouseEventArgs e)
  350. {
  351. if (ScreenOpen)
  352. GeneralControler.MouseMove(sender, e);
  353. }
  354. private void pic_Screen_MouseUp(object sender, MouseEventArgs e)
  355. {
  356. if (ScreenOpen)
  357. GeneralControler.MouseUp(sender, e);
  358. }
  359. #endregion
  360. #region 远程主机的屏幕截取
  361. //截取远程屏幕
  362. private void ScreenTimer_Tick(object sender, EventArgs e)
  363. {
  364. if (!GeneralControler.GetScreen())
  365. {
  366. ScreenTimer.Enabled = false;
  367. MessageBox.Show("远程屏幕截取失败!", "远程屏幕截取失败", MessageBoxButtons.OK, MessageBoxIcon.Information);
  368. }
  369. }
  370. //打开远程屏幕(主菜单和工具栏)
  371. private void 打开OToolStripMenuItem_Click(object sender, EventArgs e)
  372. {
  373. ScreenTimer.Enabled = false;
  374. if (!ScreenOpen)
  375. {
  376. if (GeneralControler.CurrentControler != null)
  377. {
  378. tabs.SelectedTab = tab_Desktop;
  379. GeneralControler.OpenScreen();
  380. //暂停片刻,让屏幕控制端和服务端在这时间建立连接
  381. Thread.Sleep(300);
  382. ScreenOpen = true;
  383. ScreenTimer.Enabled = true;
  384. }
  385. }
  386. else
  387. MessageBox.Show("已经打开远程截屏功能了");
  388. }
  389. //打开远程屏幕(树形视图的右键菜单)
  390. private void 屏幕控制PToolStripMenuItem_Click(object sender, EventArgs e)
  391. {
  392. TreeNode tn = trv_HostView.SelectedNode;
  393. if (tn != null)
  394. {
  395. ScreenTimer.Enabled = false;
  396. tabs.SelectedTab = tab_Desktop;
  397. if (tn != CurrentNode)
  398. {
  399. CurrentNode = tn;
  400. GeneralControler.OpenScreen(tn.Tag);
  401. //暂停片刻,让屏幕控制端和服务端在这时间建立连接
  402. Thread.Sleep(300);
  403. ScreenOpen = true;
  404. }
  405. ScreenTimer.Enabled = true;
  406. }
  407. }
  408. //暂停截取远程屏幕
  409. private void 暂停PToolStripMenuItem_Click(object sender, EventArgs e)
  410. {
  411. ScreenTimer.Enabled = false;
  412. ScreenOpen = false;
  413. }
  414. //关闭截取远程屏幕
  415. private void 关闭CToolStripMenuItem_Click(object sender, EventArgs e)
  416. {
  417. ScreenTimer.Enabled = false;
  418. ScreenOpen = false;
  419. GeneralControler.CloseScreenControler();
  420. }
  421. #endregion
  422. //与服务端对话
  423. private void btn_Send_Click(object sender, EventArgs e)
  424. {
  425. if (rtb_Speak.Text == "")
  426. MessageBox.Show("不能发送空信息!", "阻止框", MessageBoxButtons.OK, MessageBoxIcon.Stop);
  427. else
  428. {
  429. if (GeneralControler.Speak(rtb_Speak.Text))
  430. {
  431. rtb_Content.Text += ("管理员" + ":\n\t" + rtb_Speak.Text + "\n");
  432. rtb_Speak.Text = "";
  433. }
  434. }
  435. }
  436. //与服务端对话
  437. private void rtb_Speak_KeyDown(object sender, KeyEventArgs e)
  438. {
  439. if (e.Control && e.KeyCode == Keys.Enter)
  440. btn_Send_Click(sender, e);
  441. }
  442. //在关闭程序前关闭所有的连接
  443. private void frm_client_FormClosing(object sender, FormClosingEventArgs e)
  444. {
  445. e.Cancel = true;
  446. this.Hide();
  447. }
  448. private void 关机SToolStripMenuItem_Click(object sender, EventArgs e)
  449. {
  450. TreeNode tn = trv_HostView.SelectedNode;
  451. if (tn != null && tn.Tag != null)
  452. {
  453. DialogResult result = MessageBox.Show("确定关闭远程主机" + tn.Tag.ToString() + "吗?", "关闭确认", MessageBoxButtons.OKCancel);
  454. if (result == DialogResult.OK)
  455. GeneralControler.CloseWindows(tn.Tag);
  456. }
  457. else
  458. {
  459. MessageBox.Show("当前主机已经断开了连接,请移除它,然后再连接");
  460. }
  461. }
  462. private void 移除MToolStripMenuItem_Click(object sender, EventArgs e)
  463. {
  464. TreeNode tn = trv_HostView.SelectedNode;
  465. if (tn != null)
  466. {
  467. GeneralControler.RemoveControler(tn.Tag);
  468. tn.Remove();
  469. }
  470. }
  471. private void trv_HostView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
  472. {
  473. trv_HostView.SelectedNode = e.Node;
  474. if (e.Button == MouseButtons.Left && e.Node != null && e.Node != trv_HostView.Nodes[0])
  475. if (e.Node.Tag != null)
  476. {
  477. GeneralControler.ChangeControler(e.Node.Tag);
  478. }
  479. else
  480. lbl_Display.Text = "当前主机已经断开了连接,请移除它,然后再连接";
  481. }
  482. private void trv_HostView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
  483. {
  484. 重新连接RToolStripMenuItem_Click(sender, e);
  485. }
  486. private void 增加主机NToolStripMenuItem_Click(object sender, EventArgs e)
  487. {
  488. 指定主机SToolStripMenuItem_Click(sender, e);
  489. }
  490. private void 移除所有RToolStripMenuItem_Click(object sender, EventArgs e)
  491. {
  492. if (trv_HostView.Nodes[0].Nodes != null)
  493. trv_HostView.Nodes[0].Nodes.Clear();
  494. if (GeneralControler != null)
  495. GeneralControler.CloseAll();
  496. }
  497. private void 关闭连接ToolStripMenuItem_Click(object sender, EventArgs e)
  498. {
  499. 移除所有RToolStripMenuItem_Click(sender, e);
  500. }
  501. private void 退出EToolStripMenuItem_Click(object sender, EventArgs e)
  502. {
  503. if (GeneralControler != null)
  504. GeneralControler.CloseAll();
  505. System.Environment.Exit(System.Environment.ExitCode);
  506. Application.Exit();
  507. }
  508. #region 键盘事件
  509. protected override void OnKeyDown(KeyEventArgs e)
  510. {
  511. //if(ScreenOpen && tabs.SelectedTab == tab_Desktop)
  512. GeneralControler.KeyDown(e.KeyCode);
  513. }
  514. protected override void OnKeyUp(KeyEventArgs e)
  515. {
  516. if (ScreenOpen && tabs.SelectedTab == tab_Desktop)
  517. GeneralControler.KeyUp(e.KeyCode);
  518. // base.OnKeyUp(e);
  519. }
  520. #endregion
  521. //显示主窗体
  522. private void 打开OToolStripMenuItem3_Click(object sender, EventArgs e)
  523. {
  524. this.Visible = true;
  525. this.WindowState = FormWindowState.Normal;
  526. this.BringToFront();
  527. this.Show();
  528. }
  529. private void 关闭连接CToolStripMenuItem_Click(object sender, EventArgs e)
  530. {
  531. 关闭连接ToolStripMenuItem_Click(sender, e);
  532. }
  533. private void 退出EToolStripMenuItem1_Click(object sender, EventArgs e)
  534. {
  535. 退出EToolStripMenuItem_Click(sender, e);
  536. }
  537. private void 快QToolStripMenuItem_Click(object sender, EventArgs e)
  538. {
  539. ScreenTimer.Interval = 500;
  540. 中MToolStripMenuItem.Checked = false;
  541. 快QToolStripMenuItem.Checked = true;
  542. 慢SToolStripMenuItem.Checked = false;
  543. }
  544. private void 中MToolStripMenuItem_Click(object sender, EventArgs e)
  545. {
  546. ScreenTimer.Interval = 1000;
  547. 中MToolStripMenuItem.Checked = true;
  548. 快QToolStripMenuItem.Checked = false;
  549. 慢SToolStripMenuItem.Checked = false;
  550. }
  551. private void 慢SToolStripMenuItem_Click(object sender, EventArgs e)
  552. {
  553. ScreenTimer.Interval = 1500;
  554. 中MToolStripMenuItem.Checked = false;
  555. 快QToolStripMenuItem.Checked = false;
  556. 慢SToolStripMenuItem.Checked = true;
  557. }
  558. //双击托盘显示或隐藏主窗口
  559. private void notifyIcon_DoubleClick(object sender, EventArgs e)
  560. {
  561. if (this.WindowState == FormWindowState.Minimized)
  562. {
  563. 打开OToolStripMenuItem3_Click(sender, e);
  564. }
  565. else
  566. this.WindowState = FormWindowState.Minimized;
  567. }
  568. }
  569. }