長輩視訊-window端
這邊主要是接收Arduino傳過來的指令,我用C#做的。
程式執行視窗
用這程式控制下面的網頁
先選擇好com port 在點下start就能夠開始執行了
//#define open_chrome_64bit //#define dont_open_chrome using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO.Ports; //要使用serial port需要引用它 using System.Threading; using System.Diagnostics; using System.Runtime.InteropServices; namespace WindowsFormsApplication1 { public partial class Form1 : Form { StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; SerialPort serialPort; bool continuethread = false; Thread readThread; int seriallifenum = 2; int seriallife; int serial_state = 0; public Form1() { InitializeComponent(); starbutton.Enabled = false; stopbutton.Enabled = false; listBox1.Items.Clear(); string[] myPorts = SerialPort.GetPortNames(); //取得所有port的名字的方法 comboBox1.DataSource = myPorts; //直接取得所有port的名字 if(comboBox1.Items.Count > 1) { comboBox1.SelectedIndex = 1; } //serialPort = new SerialPort(comboBox1.Text, 9600, Parity.None, 8, StopBits.One); serialPort = new SerialPort(); Console.WriteLine("The following serial ports were found: {0}", comboBox1.Text); mycode mycode = new mycode(); if (comboBox1.Text != "") { starbutton.Enabled = true; } Closing += new CancelEventHandler(Form1_Closing); } /* thread modify form */ //宣告一個委派,定義參數 public delegate void btnchang(); public delegate void mylog(string message); public delegate void threaddie(); /*** 開始執行通訊後,切換按鈕狀態 ***/ public void changbtn() { starbutton.Enabled = false; stopbutton.Enabled = true; } /*** timeout close thread. 超時關閉thread ***/ public void threadstop() { listboxlog(string.Format("{0} {1} {2}", "com port", serialPort.PortName, "No response")); continuethread = false; serialPort.Close(); serial_state = 0; Console.WriteLine("com port close"); starbutton.Enabled = true; stopbutton.Enabled = false; listboxlog(string.Format("{0} {1} {2}", "com port", serialPort.PortName, "close")); error_messagebox(); } /* thread modify form */ /*** this is read message of serial port function. 讀取comport傳來的訊息 ***/ public void Read() { btnchang btn = new btnchang(changbtn); this.BeginInvoke(btn); while (continuethread) { string message = "abc"; try { /******** * step: * read serial port * if (pick up phone) * if (hang up phone) * if (volume up) * if (volume down) * ******/ message = serialPort.ReadLine(); message = message.Remove(message.Length-1, 1); Console.WriteLine(message); //實作委派,指向員執行緒中被呼叫的Method mylog mylog = new mylog(listboxlog); this.BeginInvoke(mylog, new Object[] { string.Format("{0}{1}", "receive : ", message) }); StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; if (stringComparer.Equals("open", message) & serial_state == 1) { this.BeginInvoke(mylog, new Object[] { string.Format("{0}{1}", "do : ", message) }); mycode.open_hangouts(); serialPort.ReadTimeout = 30*60*1000; serial_state = 2; } else if (stringComparer.Equals("pick up", message) & serial_state == 2) { this.BeginInvoke(mylog, new Object[] { string.Format("{0}{1}", "do : ", message) }); mycode.pick_up1(); mycode.pick_up2(); } else if (stringComparer.Equals("hang up", message) & serial_state == 2) { this.BeginInvoke(mylog, new Object[] { string.Format("{0}{1}", "do : ", message) }); mycode.findHangoutsWindow(); mycode.CloseChatRoom(); } else if (stringComparer.Equals("vol up", message) & serial_state == 2) { this.BeginInvoke(mylog, new Object[] { string.Format("{0}{1}", "do : ", message) }); mycode.btnVup_Click(); mycode.vol_up(); } else if (stringComparer.Equals("vol down", message) & serial_state == 2) { this.BeginInvoke(mylog, new Object[] { string.Format("{0}{1}", "do : ", message) }); mycode.btnVdown_Click(); mycode.vol_down(); } else if (stringComparer.Equals("connecting", message) & serial_state == 2) { seriallife = seriallifenum; } } catch (TimeoutException) { Console.WriteLine("TimeoutException"); serialPort.WriteLine("connect"); seriallife = seriallife -1; if(seriallife < 1) { threaddie rstop = new threaddie(threadstop); this.BeginInvoke(rstop); continuethread = false; } } catch (InvalidOperationException) {/*執行中通訊(com port)被拔除*/ Console.WriteLine("InvalidOperationException"); threaddie rstop = new threaddie(threadstop); this.BeginInvoke(rstop); continuethread = false; } catch (System.IO.IOException) {/*執行中通訊(com port)被拔除*/ Console.WriteLine("System.IO.IOException"); threaddie rstop = new threaddie(threadstop); this.BeginInvoke(rstop); continuethread = false; } } } /*** start 按鈕按下 ***/ private void startbutton_Click(object sender, EventArgs e) { listboxlog("startbutton_Click"); if (comboBox1.Text != "") { StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; serialPort = new SerialPort(comboBox1.Text, 9600, Parity.None, 8, StopBits.One); readThread = new Thread(Read); continuethread = true; seriallife = seriallifenum; serialPort.ReadTimeout = 1000; //readThread.IsBackground = true; try { serialPort.Open(); if (!readThread.IsAlive) { readThread.Start(); listboxlog("readThread Start"); } Console.WriteLine("com port start"); listboxlog(string.Format("{0} {1} {2}", "com port", serialPort.PortName, "start")); serialPort.WriteLine("serial start"); serial_state = 1; } catch (System.IO.IOException) { stop_serial_and_thread(false); error_messagebox(); } } } /*** stop 按鈕按下 ***/ private void stopbutton_Click(object sender, EventArgs e) { listboxlog("stopbutton_Click"); stop_serial_and_thread(true); } /*** application close 程式被關閉 ***/ private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if (stopbutton.Enabled) { stop_serial_and_thread(true); } } /*** 關閉 com port 連線,與 thread ***/ private void stop_serial_and_thread(bool have_serialport) { if (have_serialport) { serialPort.WriteLine("serial quit"); } continuethread = false; if (readThread != null && readThread.IsAlive) { readThread.Join(); readThread = null; if (have_serialport) { serialPort.Close(); } } Console.WriteLine("com port close"); serial_state = 0; starbutton.Enabled = true; stopbutton.Enabled = false; listboxlog(string.Format("{0} {1} {2}", "com port", serialPort.PortName, "close")); } /*** 按下下拉是選單的動作 ***/ private void comboBox1_Click(object sender, EventArgs e) { string[] myPorts = SerialPort.GetPortNames(); //取得所有port的名字的方法 comboBox1.DataSource = myPorts; //直接取得所有port的名字 if (comboBox1.Text != "") { starbutton.Enabled = true; } if (comboBox1.Text == "") { starbutton.Enabled = false; } } /*** application log record 程式執行紀錄 ***/ private void listboxlog(string message) { if ((listBox1.Items.Count - 1) >= 50000) { listBox1.Items.RemoveAt(0); //listBox1.SetSelected(5, true); } string date = DateTime.Now.ToShortDateString(); string time = DateTime.Now.ToString("HH:mm ss"); listBox1.Items.Add(string.Format("{0} {1} {2}", date, time, message)); listBox1.TopIndex = listBox1.Items.Count - 1; } /*** 連線錯誤訊息框 ***/ private void error_messagebox() { this.Activate(); MessageBox.Show(comboBox1.Text + " 使用無效,請選擇一種方式修正:\n\n 1.請等待10秒再按下開始(start)\n 2.修改正確的 com port 值\n 3.重新開啟本程式\n 4.重新插入設備.", "視訊控制程式 連線錯誤"); } } /************************ * * mycode class * * 1. open hangouts app * 2. pick up phone * 3. close chat room * 4. hang up phone (close videophone room) * 5. volume up * 6. volume down * 7. volume mute * * **********************/ public class mycode { public static void open_hangouts() { Process chrome = new Process(); // FileName 是要執行的檔案 #if !open_chrome_64bit string fname = @"C:\Program Files\Google\Chrome\Application\chrome.exe"; #else string fname = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"; #endif chrome.StartInfo.FileName = fname; chrome.StartInfo.Arguments = "https://hangouts.google.com/?hl=zh-TW"; #if !dont_open_chrome chrome.Start(); #endif } public static void pick_up1() { /** * 按下剛打來的"接聽"按鈕 * 1.高的-聊天室視窗 * x 1150 1200 1263 * y 265 280 295 * * 2.低的-聊天室視窗 * x 1148 1262 幾乎同上 * y 301 316 331 * * 要低到高 **/ int x = 1190; int y = 316; Cursor.Position = new Point(x, y); ClassMouse.LeftClick(); y = 280; Cursor.Position = new Point(x, y); ClassMouse.LeftClick(); } public static void pick_up2() { /** * 按下"加入對話 * * x 1016 1152 1272 * * 1.高的-聊天室視窗 * y 215 235 255 * * 2.低的-聊天室視窗 * y 250 270 290 * * 要低到高 **/ int x = 1190; int y = 270; Cursor.Position = new Point(x, y); ClassMouse.LeftClick(); y = 235; Cursor.Position = new Point(x, y); ClassMouse.LeftClick(); } public static void CloseChatRoom() { /** * 按下"X"關閉聊天室 * * x 1250 1255 1264 * * 1.高的-聊天室視窗 * y 156 161 166 * * 2.低的-聊天室視窗 * y 190 195 200 * * 要高到低 **/ int x = 1255; int y = 161; Cursor.Position = new Point(x, y); ClassMouse.LeftClick(); y = 195; Cursor.Position = new Point(x, y); ClassMouse.LeftClick(); } /* * * keyboard ctrl * */ // Get a handle to an application window. [DllImport("USER32.DLL", CharSet = CharSet.Unicode)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); // Activate an application window. [DllImport("USER32.DLL")] public static extern bool SetForegroundWindow(IntPtr hWnd); // Send a series of key presses to the Calculator application. public static void Calculator() { // Get a handle to the Calculator application. The window class // and window name were obtained using the Spy++ tool. IntPtr calculatorHandle = FindWindow("ApplicationFrameWindow", "小算盤"); //Chrome_WidgetWin_1 //Hangouts 視訊通話 // Verify that Calculator is a running process. if (calculatorHandle == IntPtr.Zero) { MessageBox.Show("Calculator is not running."); return; } // Make Calculator the foreground application and send it // a set of calculations. SetForegroundWindow(calculatorHandle); /* SendKeys.SendWait("111"); SendKeys.SendWait("*"); SendKeys.SendWait("11"); SendKeys.SendWait("=");*/ } public static void findHangoutsWindow() { // Get a handle to the application. // The window class and window name were obtained using the Spy++ tool. IntPtr HangoutsHandle = FindWindow(null, "Hangouts 視訊通話 - Google Chrome"); //Chrome_WidgetWin_1 //Hangouts 視訊通話 //Hangouts 視訊通話 - Google Chrome // Verify that Calculator is a running process. if (HangoutsHandle == IntPtr.Zero) { //MessageBox.Show("Calculator is not running."); return; } // Make Calculator the foreground application and send it // a set of calculations. SetForegroundWindow(HangoutsHandle); Thread.Sleep(1000); SendKeys.SendWait("^w"); while (HangoutsHandle != IntPtr.Zero) { Thread.Sleep(1000); HangoutsHandle = FindWindow(null, "Hangouts 視訊通話 - Google Chrome"); } } public static void ctrl_atl_del() { SendKeys.SendWait("^+{ESC}"); //SendKeys.SendWait("^%{DELETE}"); //SendKeys.Send("%{F4}"); } /** * xp * http://www.cnblogs.com/tmywu/archive/2013/03/18/2965585.html * http://fecbob.pixnet.net/blog/post/38064589-c%23-%E9%9F%B3%E9%87%8F%E6%8E%A7%E5%88%B6%E5%99%A8 **/ //運用WinAPI控制電腦靜音與音量 private const int APPCOMMAND_VOLUME_MUTE = 0x80000; private const int APPCOMMAND_VOLUME_UP = 0x0a0000; private const int APPCOMMAND_VOLUME_DOWN = 0x090000; private const int WM_APPCOMMAND = 0x319; //private static IntPtr Handle; public static Process p = Process.GetCurrentProcess(); [DllImport("user32.dll")] public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); public static void btnVup_Click() { // 聲音變大 SendMessageW(p.Handle, WM_APPCOMMAND, p.Handle, (IntPtr)APPCOMMAND_VOLUME_UP); } public static void btnVdown_Click() { // 聲音變小 SendMessageW(p.Handle, WM_APPCOMMAND, p.Handle, (IntPtr)APPCOMMAND_VOLUME_DOWN); } public static void btnMute_Click() { // 靜音 SendMessageW(p.Handle, WM_APPCOMMAND, p.Handle, (IntPtr)APPCOMMAND_VOLUME_MUTE); } /** * * * */ [DllImport("winmm.dll")] public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume); [DllImport("winmm.dll")] public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume); public static void vol_up() { // 設定變數CurrVol用以取得目前音量 uint CurrVol = 0; // 透過waveOutGetVolume取得目前音量給變數CurrVol waveOutGetVolume(IntPtr.Zero, out CurrVol); // 計算音量大小 ushort CalcVol = (ushort)(CurrVol & 0x0000ffff); // 將音量大小分為10階,並指定給trackWaved控制項 int vol_value = CalcVol / (ushort.MaxValue / 10); Console.WriteLine(CalcVol / (ushort.MaxValue / 10)); vol_value = vol_value + 1; ValueChanged(vol_value); } public static void vol_down() { // 設定變數CurrVol用以取得目前音量 uint CurrVol = 0; // 透過waveOutGetVolume取得目前音量給變數CurrVol waveOutGetVolume(IntPtr.Zero, out CurrVol); // 計算音量大小 ushort CalcVol = (ushort)(CurrVol & 0x0000ffff); // 將音量大小分為10階,並指定給trackWaved控制項 int vol_value = CalcVol / (ushort.MaxValue / 10); Console.WriteLine(CalcVol / (ushort.MaxValue / 10)); vol_value = vol_value - 1; ValueChanged(vol_value); } // 當控制項trackWave的值改變時,設定音量 private static void ValueChanged(int value) { // 由trackWave上的值計算要設定的音量大小 int NewVolume = ((ushort.MaxValue / 10) * value); // 設定相同的數值於左聲道與右聲道 uint NewVolumeAllChannels = (((uint)NewVolume & 0x0000ffff) | ((uint)NewVolume << 16)); // 設定音量 waveOutSetVolume(IntPtr.Zero, NewVolumeAllChannels); } } }
留言
張貼留言