因為公司的夥伴都會突然的走進辦公室;突然的就開口說話,完全不理會我還來不及拔耳機這件事,所以每次都會出現訊息漏洞的問題(笑),所以一個突發奇想,決定用手邊的Arduino做一個可以直接控制電腦靜音的小程式。
此一程式會用到Serial Port傳輸資訊,那就馬上開始吧!
設備
Arduino UNO 一個
觸碰開關 一個
直接進入程式
Arduino 部分程式
void setup() { // put your setup code here, to run once: // set baud rate Serial.begin(9600); pinMode(INPUT, 8); } void loop() { // put your main code here, to run repeatedly: //serial write the switch state Serial.write(digitalRead(8)); delay(300); }
Windows Form 部分程式
using System; using System.Runtime.InteropServices; using System.Windows.Forms; //讀取電腦目前開啟的port使用 using System.IO.Ports; namespace setWinVolume { public partial class Form1 : Form { //宣告各種功能變數 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; public Form1() { InitializeComponent(); } //呼叫windows API 控制音量 [DllImport("user32.dll")] public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); private void button1_Click(object sender, EventArgs e) { try { if (comboBox1.Text == "") { label2.Text="請選擇com port!"; } else { int check = 0; // serialPort1.PortName = comboBox1.Text; serialPort1.BaudRate = 9600; serialPort1.Open(); //是否已開啟 if (serialPort1.IsOpen) { label2.Text = "已連接至" + comboBox1.Text; while (true) { //接收Serial資料 int buf = serialPort1.ReadChar(); if (buf == 1) { muteSet(); check++; if (check >= 6) { //連續接收到6個HIGH訊號,跳出迴圈 break; } } else { check = 0; } } serialPort1.Close(); this.Close(); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void Form1_Load(object sender, EventArgs e) { //預設介面資料 //取得可使用的port string[] ports = SerialPort.GetPortNames(); comboBox1.Items.AddRange(ports); label2.Text = ""; } public void muteSet() { // 靜音 SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)APPCOMMAND_VOLUME_MUTE); }
控制音量的部分,我用到了window API來控制,最近還想做按按鈕切換畫面的功能,這樣如果在看"影片"的過程,有人突然衝進房間,就可以快速接換畫面喔!
但還沒找到win10切換畫面的API,之後如果有找到再來發文分享。
在呼叫API的地方,因為是另外呼叫DLL,所以如果仔細看程式會發現有一個[DllImport("user32.dll")],這就是去呼叫DLL中程式的功能,如果你在自己程式中的function名稱跟DLL裡是一樣的,就只要照我程式碼中的做法即可,但如果名稱不一樣就必須改成[DllImport(@"D:\dvrSdk\DvrSdkCtrlfcs.dll", EntryPoint = "原程式名稱")],其他更詳細的部分,會在之後介紹C#使用C/C++ DLL的文章中向大家詳細說明喔,這也是我最近卡住的問題(笑)。
Windows Form 程式介面
以上是這次的一個小小程式應用,其實沒什麼點太困難,跟大家分享一個小創意,最近公司的專案卡住,所以一直沒有時間寫文章,卡了幾個主題還沒開始動手,等專案結束,就有新文章囉。
如果喜歡我的小創意,別忘了按個讚喔!
好了,以上是小弟個人的關於結合Arduino控制電腦靜音小程式撰寫心得,給大家參考,如有誤人子弟之處,還請各位先進給予指教。