中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 軟硬結合——酷我音樂盒的逆天玩法

        軟硬結合——酷我音樂盒的逆天玩法

        作者: 時間:2017-01-18 來源:網絡 收藏

          22 int width = rect.Right - rect.Left; //窗口的寬度

        本文引用地址:http://www.antipu.com.cn/article/201701/343047.htm

          23 int height = rect.Bottom - rect.Top; //窗口的高度

          24 int x = rect.Right; //窗口的位置

          25 int y = rect.Top;

          26

          27 int X=0,Y=0;

          28 if(n_control_type==0)//坐標[-20,200]:第3列表 [-120,200]:第2列表 [-220,200]第1列表

          29 { //坐標[-200,100]:上一曲 [-170,100]暫停 [-145,100]下一曲

          30 X = x - 200;

          31 Y = y + 100;

          32 }

          33 else if (n_control_type == 1)

          34 {

          35 X = x - 170;

          36 Y = y + 100;

          37 }

          38 else

          39 {

          40 X = x - 145;

          41 Y = y + 100;

          42 }

          43

          44 SetCursorPos(X, Y); //移動鼠標

          45 mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, X * 65536 / 768, 0, 0); //發(fā)送鼠標信息

          46 mouse_event(MOUSEEVENTF_LEFTUP, Y * 65536 / 1024, Y * 65536 / 768, 0, 0);

          47 SetCursorPos(pt.X, pt.Y); //移動鼠標回到原位置

          48

          49 //if (isVisabled == 24) ShowWindow(hMusic, SW_HIDE);

          50 //SetParent(hMusic, this.Handle);

          51 //EnableWindow((IntPtr)this.Handle, true);

          52 SetWindowPos(hMusic, (IntPtr)this.Handle, x, y, width, height, SWP_NOMOVE); //使能窗口聚焦原窗口

          53 SetForegroundWindow(hCurWin); //將原來窗口放在最上層

          54 }

          PS:這個函數負責找到酷我音樂盒的窗口(第10行)、頂層窗口切換(第18行、第52行、第53行)、鼠標位置設置(第16行、第44行、第47行)、鼠標點擊消息的生成(第45行、第46行)、點擊區(qū)域計算(第27~42行)

          GetForegroundWindow(); 獲取當前頂層窗口句柄,不懂百度一下,就windows API介紹很多,初學者知道怎么用就行啦![在調用它之前要寫這些代碼,下面說的調用API都要這樣的!]

          1 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]

          2 public static extern IntPtr GetForegroundWindow();

          FindWindow("kwmusicmaindlg", null);根據窗口類名或者窗口名獲得窗口句柄。PS:該如何知道某個窗口的類名或者窗口名呢?一般是用VC6.0或者是VS系列軟件的Tool-->Spy++,具體請見我寫的一篇博文,里面有詳細介紹:http://www.cnblogs.com/zjutlitao/p/3889900.html

          1 [DllImport("user32.dll", EntryPoint = "FindWindow")]

          2 public static extern IntPtr FindWindow(

          3 string lpClassName,

          4 string lpWindowName

          5 );

          GetCursorPos(out pt);獲取當前鼠標的位置,保存在Point結構體內,這里因為我們想讓鼠標點擊一下按鈕然后回到原來的位置,所以要保存原來的位置!

          1 [DllImport("user32.dll")]

          2 public static extern bool GetCursorPos(out Point pt);

          ShowWindow(hMusic,SW_SHOWNORMAL);根據句柄顯示窗口,這里第二個參數是設定窗口以哪種方式顯示的,主要有以最小化顯示、最大化顯示、正常顯示.....具體參見度娘~我們這里是為了避免有時候音樂盒最小化,我們得把它打開才能觸發(fā)點擊事件有效。(我本來想用個標記來標記它原來的狀態(tài)然后在處理之后恢復音樂盒自身的狀態(tài),但是覺得還得寫些代碼,沒時間啦,調試這個浪費了很長時間~)

          1 //private readonly int SW_HIDE = 0; //隱藏

          2 private readonly int SW_SHOWNORMAL = 1; //還原

          3 [DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]

          4 private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

          SetForegroundWindow(hMusic); 將活動窗口切換到句柄所指窗口,這樣鼠標點擊對應區(qū)域窗口才能接收到鼠標點擊消息!

          1 [DllImport("user32.dll")]

          2 private static extern bool SetForegroundWindow(IntPtr hWnd);

          GetWindowRect(hMusic, ref rect); 獲取指定窗口的在桌面上的矩形坐標(這樣就能根據這個值計算目標窗口的大小和位置啦:20~25行就是干這個的)

          1 [DllImport("user32.dll")]

          2 [return: MarshalAs(UnmanagedType.Bool)]

          3 static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

          4

          5 [StructLayout(LayoutKind.Sequential)]

          6 public struct RECT

          7 {

          8 public int Left; //最左坐標

          9 public int Top; //最上坐標

          10 public int Right; //最右坐標

          11 public int Bottom; //最下坐標

          12 }

          SetCursorPos(X, Y); 設置鼠標光標位置(X,Y)

          1 [DllImport("user32.dll", EntryPoint = "SetCursorPos")]

          2 private static extern int SetCursorPos(int x, int y);

          mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, X * 65536 / 768, 0, 0); 發(fā)送消息函數,我們知道windows是消息機制的,你點一下鼠標其實就是光標移到指定位置,然后向系統(tǒng)發(fā)送一個鼠標按動消息,這里我仿制一個鼠標左擊時間,第45行負責在指定位置發(fā)送個鼠標左鍵按下的消息,第46行發(fā)送個對應的鼠標左鍵抬起的消息,這樣一按一抬就組成了一個點擊事件。

          1 private readonly int MOUSEEVENTF_LEFTDOWN = 0x2;

          2 private readonly int MOUSEEVENTF_LEFTUP = 0x4;

          3 [DllImport("user32")]

          4 public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

          SetWindowPos(hMusic, (IntPtr)this.Handle, x, y, width, height, SWP_NOMOVE); 這個函數和ShowWindow有點像,只是這個可以設置窗口的三維顯示,為什么是三維?平面窗口還有一維是窗口的疊放順序,具體可以問度娘~(這里刪了這句好像也沒啥影響,當初因為沒有下面那句,所以需要這個函數將焦點放到軟件窗口)

          1 static readonly IntPtr HWND_TOP = new IntPtr(0);

          2 const UInt32 SWP_NOMOVE = 0x0002;

          3 [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowPos", SetLastError = true)]

          4 private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);

          5.1.4、時間函數TImer

          往窗口里加一個Timer控件:[長下面那個模樣,屬性設置為Interval:100,然后給它一個消息函數,屬性中的那個閃電的標志],比MFC要方便的多,MFC要自己寫這貨,有點麻煩,但是對于打基礎的童鞋還是建議從win32學起,然后再學MFC這樣你對windows消息機制會有比較清晰的理解!嘿嘿,撤遠啦!其實這個Timer對應的消息函數就像一個會定時執(zhí)行的函數一樣,你只要在里面寫些邏輯,它會每隔一定的時間執(zhí)行的。比如你想做動畫效果,讓一個小球移動,那么小球的坐標的改變的計算可以放在這里面寫。下面看一下我的這個函數中寫了什么:

          1 private string Status, ReceivedData;

          2 private void timer1_Tick(object sender, EventArgs e)

          3 {

          4 StatusMessage.Text = Status;

          5 StatusMessage.Text = ReceivedData;

          6 //當有有效信號過來觸發(fā)控制

          7 if (signal == 1) func(2);//下一曲

          8 if (signal == 2) func(0);//上一曲

          9 if (signal == 3) func(1);//暫 停

          10 signal = 0;

          11 }

          PS:其實就是更新那個文本顯示區(qū)的內容和根據上面收來的數據進行處理然后產生的3種不同的控制命令,來調用func函數執(zhí)行不同的點擊命令!

          >_<:好啦,軟件部分終于說完啦(那其它3個功能按鈕直接調用func函數就行啦),其實硬件部分更多,剛才一直沒有說那個濾波算法,及對應的命令信號signal是如何產生的....下面就要介紹啦!

          6、硬件部分及濾波、信號產生算法詳解:

          其實硬件部分就是CPU采集超聲波測距儀采集的距離的信息通過發(fā)送給電腦,電腦再對發(fā)送過來的數據進行分析,來看看是要切歌還是暫停還是一些干擾(這里在硬件和圖像處理中經常會談到的名詞:濾波)。這里只貼一下硬件部分的代碼(難點是濾波,硬件是基于stc80c52的程序,包括與測距模塊的通信程序、通信程序兩大部分,具體細節(jié)里面有很詳細的注釋,建議如果是新手最好看看《新概念51單片機C語言教程》不錯的哦~)



        關鍵詞: C# 串口

        評論


        相關推薦

        技術專區(qū)

        關閉