close

因為公司的夥伴都會突然的走進辦公室;突然的就開口說話,完全不理會我還來不及拔耳機這件事,所以每次都會出現訊息漏洞的問題(笑),所以一個突發奇想,決定用手邊的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 程式介面

擷取.PNG

 

 

以上是這次的一個小小程式應用,其實沒什麼點太困難,跟大家分享一個小創意,最近公司的專案卡住,所以一直沒有時間寫文章,卡了幾個主題還沒開始動手,等專案結束,就有新文章囉。

如果喜歡我的小創意,別忘了按個讚喔!


好了,以上是小弟個人的關於結合Arduino控制電腦靜音小程式撰寫心得,給大家參考,如有誤人子弟之處,還請各位先進給予指教。

 

 

 

 

 

 

 

 

 

arrow
arrow

    zhong.jun.jimmy 發表在 痞客邦 留言(0) 人氣()