因為公司的夥伴都會突然的走進辦公室;突然的就開口說話,完全不理會我還來不及拔耳機這件事,所以每次都會出現訊息漏洞的問題(笑),所以一個突發奇想,決定用手邊的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控制電腦靜音小程式撰寫心得,給大家參考,如有誤人子弟之處,還請各位先進給予指教。
留言列表