顯示具有 WPF 標籤的文章。 顯示所有文章
顯示具有 WPF 標籤的文章。 顯示所有文章

2014/02/17

WPF 透過RegistryKey取得預設瀏覽器

Button1是對岸提供的機碼,Button2也是參考對岸的機碼
C#.Net適用

using System;
using System.Windows;
using Microsoft.Win32;

namespace GetProcessForm
{
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice");
            Console.WriteLine(key.GetValue("Progid").ToString());
            key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice");
            Console.WriteLine(key.GetValue("Progid").ToString());
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            RegistryKey key = Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command\");
            string s = key.GetValue("").ToString();
            string str = s.Substring(s.IndexOf(":") - 1, s.IndexOf(".exe") + ".exe".Length - s.IndexOf(":") + 1);
            Console.WriteLine(s);
        }
    }
}


參考資料:
http://bbs.csdn.net/topics/390401279?page=1#post-394000214
http://superuser.com/questions/368814/how-do-i-change-my-default-browser-to-an-unlisted-program-in-windows-7

WPF 透過Process判斷瀏覽器是否開啟

C#.Net適用,我的想法是透過目前的Process來查詢瀏覽器是否開啟,但是聰明的你會發現這是有缺陷的XD


using System;
using System.Windows;
using System.Diagnostics;

namespace GetProcessForm
{
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Process[] all = Process.GetProcesses();
            int length = all.Length;
            for (int index = 0; index < length; index++)
            {
                Console.WriteLine(String.Format("{0} ID:{1}",  all[index].ProcessName, all[index].Id));
            }
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            Process []ps = Process.GetProcessesByName("chrome");
            foreach (Process p in ps)
            {
                Console.WriteLine(String.Format("{0} ID:{1}", p.ProcessName, p.Id));
            } 
        }
    }
}


Button1執行結果:


Button2執行結果:


參考資料:
http://msdn.microsoft.com/zh-tw/library/System.Diagnostics.Process_methods(v=vs.110).aspx

2014/02/16

C#.Net 指定瀏覽器瀏覽網頁

WPF也適用

Form1.cs:
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //使用預設瀏覽器
            System.Diagnostics.Process.Start( "http://google.com.tw");

            //使用IE瀏覽器
            System.Diagnostics.Process.Start("iexplore.exe", "http://google.com.tw");

            //使用Chrome瀏覽器
            System.Diagnostics.Process.Start("chrome.exe", "http://google.com.tw");

            //使用Firefox瀏覽器
            System.Diagnostics.Process.Start("firefox.exe", "http://google.com.tw");

            //使用Safari瀏覽器
            System.Diagnostics.Process.Start("safari.exe", "http://google.com.tw");
        }
    }
}



參考資料:
http://msdn.microsoft.com/zh-tw/library/cc304466.aspx
http://www.programmer-club.com/showSameTitleN/csharp/3588.html
http://www.dotblogs.com.tw/atowngit/archive/2009/12/26/12678.aspx

2013/12/23

WPF 資料繫節 (Data Binding)

資料繫節(Data Binding):就是將資料與介面綁在一起
資料變更時,自動更新介面的內容


XAML:
<Window x:Class="WPF_DataBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="133" Width="206">
    <Grid Margin="0,0,2,-4">
        <Button Content="{Binding ElementName=textbox,Path=Text}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="10,47,0,0"/>
        <TextBox Name="textbox" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap"  VerticalAlignment="Top" Width="120"/>
    </Grid>
</Window>

可以由上面程式碼看到,其實就是將Button的內容跟textbox的文字綁在一起,當textbox改變時,button就隨之而改變
如果想榜定的元件是Slider,就將Path改變成Value即可,因為Slider數值改變時,就是改變到Value

資料變更前



資料變更後


2013/12/07

C#.Net Kinect 取得玩家ID

取得玩家ID當然是有點用處,這篇僅把程式碼貼出來而已,詳細的作法可以看MSDN!



XAML:
<Window x:Class="WpfApplicationKinectTest2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Unloaded="Window_Unloaded" Loaded="Window_Loaded">
    <Grid>
        <Image Name="Image"></Image>
    </Grid>
</Window>



C#.Net lock in a single skeleton in Microsoft Kinect SDK v 1.8

我們以這篇『C#.Net KINECT 結合影像與骨架』程式碼作為基底,以該基底延伸出新功能。
KinectSensor內有個SkeletonStreamSkeletonStream是用於接收骨架追蹤的串流,SkeletonStream類別又包含了AppChoosesSkeletons屬性,該屬性為布林值

AppChoosesSkeletons的說明為『Gets or sets a value indicating whether the application or the runtime chooses which skeletons to track.』
聰明的你一定看得出來用於鎖定骨架的第一步就設定為true

在透過ChooseSkeletons來鎖定指定的骨架,每個骨架都有它的編號,要注意ChooseSkeletons是多載的方法



  1. SkeletonStream.ChooseSkeletons ()
  2. SkeletonStream.ChooseSkeletons (Int32)
  3. SkeletonStream.ChooseSkeletons (Int32, Int32)

第一種方法僅偵測當前的骨架
第二種方法僅偵測指定的骨架ID,填入0也等同於第一種方法
第三種方法僅偵測兩個指定的骨架ID,這意謂著Kinect頂多鎖定兩個人的骨架而已

鎖定之前,要先確認AppChoosesSkeletons值要設定為True,否則會出錯

2013/12/04

WPF 讓Thread透過SynchronizationContext更新UI資訊

專題遇到將資料即時更新到Label,但是資料並不是透過主執行緒去取得資料
像是RS232的資料傳輸,我是透過Thread去執行

原始程式碼如下:

using System;
using System.Threading;
using System.Windows;

namespace WpfApplicationTest
{
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private Thread th;


        private void MainButton_Update_Click(object sender, RoutedEventArgs e)
        {
            if (th == null)
            {
                th = new Thread(new ThreadStart(Update));
                th.Start();
            }
        }

        private void Update()
        {
            while (true)
            {
                int random_Number = new Random().Next();
                MainLabel_test.Content = random_Number;
                Thread.Sleep(1000);
            }
        }

    }
}



2013/11/13

C#.Net 透過TTS去發音 Windows7和Windows8適用

引用System.Speech 4.0.0.0的版本


測試系統為Windows7 32位元 企業版



XML:
<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="80" Width="100">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
    </Grid>
</Window>


Code:
using System.Speech.Synthesis;
using System.Windows;

namespace WpfApplication
{
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            SpeechSynthesizer synthesizer = new SpeechSynthesizer();
            synthesizer.Rate = 1;
            synthesizer.Volume = 100;
            synthesizer.Speak("I love you");
        }
    }
}


參考資料:
http://msdn.microsoft.com/zh-tw/library/gg145021.aspx
http://msdn.microsoft.com/zh-tw/library/system.speech.synthesis.aspx
http://msdn.microsoft.com/zh-tw/library/system.speech.synthesis.speechsynthesizer.aspx

2013/09/17

C#.Net 透過Kinect辨識聲音

Kinect本身內建了麥克風陣列,麥克風陣列有一組是作為辨識聲音用的
在辨識聲音上有一個重點是,體感裝置一定要離人很近以及室內較不易吵雜,否則會讓Kinect辨識不清楚

我這次的示範直接將感測器放置在電腦旁而已,如果想知道能測多遠的朋友可以自行量測

開始開發前,你必須先安裝『Microsoft Speech Platform SDK』,目前的版本是出到第11版
如果你的電腦跟我一樣是安裝64位元的朋友,建議你32和64的版本都要安裝,以免到時候出錯

如果想瞭解『Microsoft Speech Platform』,就直接點擊進去看吧!

安裝完『Microsoft Speech Platform SDK』後,初始語言包僅只有英文,如果想要新增的朋友可以點擊『Microsoft Speech Platform - Runtime Languages』下載你需要的語言包

在這邊提醒一下,W8是不支援語言包的,不過仍可以使用『Microsoft Speech Platform SDK』,目前打文章的電腦就是W8 XDD

程式載入時會觸發Window_Loaded事件,該事件在之前的幾篇文章也講解過了。差異只是呼叫的方法不一樣,如果不懂的可以回去看我之前寫得『透過Kinect取得聲音來源方位』及『透過Kinect取聲音並繪製成音波圖

C#.Net 透過Kinect取得聲音來源方位

Kinect麥克風以感應器為中心,辨識±50度聲音來源


透過聲音來源,我們可以再去限制其範圍,最後將其範圍資料導入,去得知聲音內容


2013/09/16

C#.Net 透過Kinect取聲音並繪製成音波圖

Kinect是有內建麥克風陣列在裡頭,所謂的陣列麥克風就是兩組以上,並以麥克風進行偵測,所得聲音用DSP做比對,來還原原始音效。

Kinect的麥克風陣列內含了四組麥克風,分為兩組,一組來取得聲音並進行消除雜音等演算法處理之後,可提供另一組聲音辨識的功能。


最近因為上課需要,所以要在寫Kinect的相關程式,當然這篇就是拿來練功的,不過這次是透過『Kinect體感程式探索-使用C#』去學習關於Kinect的聲音處理部份。而不再透過官方的API

這樣學起來也比較快,省時間XDDD

照慣例,還是要分析一下程式碼,這樣才能有所學習到





2013/07/09

WPF ToolKit BusyIndicator

這次介紹的是一個WPF ToolKit中的一個元件『BusyIndicator』,這個元件能夠提供更直覺得介面
當背後服務正在執行時能夠跳出一個Loading的介面,可以讓程式更直覺

首先先去下載Extended WPF Toolkit Binaries,如果是Web可以下載Extended WPF Toolkit Live Explorer

下載下來後,將其解壓縮。開啟VS,在此用VS2010示範

先將該Xceed.Wpf.Toolkit.dll加入到該專案參考



C#.Net Kinect 改變上下傾角

Kinect有內建一個馬達可以用來改變上下的傾角,Kinect可以轉動的傾角大概±27°
可以透過KinectSensor的ElevationAngle去取得到傾角角度,也可以透過該屬性去改變傾角角度
但官方有建議不要太頻繁的去轉動,有可能會造成馬達損毀

如果有想要左右移動的開發者可以自行安裝馬達,利用arduino或8051等晶片去控制


XAML:
<Window x:Class="KinectAdjustTiltAngle.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="700" Width="646" Loaded="Window_Loaded" Unloaded="Window_Unloaded">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="530*" />
            <ColumnDefinition Width="94*" />
        </Grid.ColumnDefinitions>
        <Image Name="image"  Height="640" Width="480" Margin="12,20,38,0"></Image>
        <Slider Height="629" Margin="513,20,81,0" Name="sliderKinectAngle" VerticalAlignment="Top" Minimum="-27" Maximum="27" Orientation="Vertical" Grid.ColumnSpan="2" PreviewMouseUp="sliderKinectAngle_PreviewMouseUp" />
        <Label Name="labelCurrentAngle"  Content="目前角度" Height="28" HorizontalAlignment="Left" Margin="19,323,0,0"  VerticalAlignment="Top" Grid.Column="1" />
    </Grid>
</Window>


2013/07/08

C#.Net 擷取Kinect影像


這個專案用於儲存Kinect影像,每秒都儲存一張照片在使用者的圖片資料夾裏頭
如需要儲存更多張影像的使用者可以自行修正執行續休眠時間
或用其他方式去控制,為了避免硬碟故障,所以我就一秒只儲存一張XD

<Window x:Class="Kinect_Storage_Images.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Kinect Storage Images" Height="50" Width="150" Loaded="Window_Loaded" Unloaded="Window_Unloaded">
</Window>


2013/05/15

C# WPF Timer

這個專案主要透過Timer的Thread去進行UI更新,但Timer是一個Thread
但Main是一個視窗,一個視窗也是一個Thread去Run的
所以一個視窗要有兩個Thread必須透過一些OS提出的機制去解決

我在這邊就是用SynchronizationContext去解決,推薦先看完『[WPF] 跨執行緒控制表單』這篇文章。

這篇文章非常值得推薦,看起來對方好像不是微軟MVP,但這篇卻深入瞭解到Thread的精隨
這位前輩在他的文章還有貼了一篇『MSDN 雜誌:平行計算 - SynchronizationContext 綜述』,非常值得一看!!





2013/05/12

C#.Net KINECT 結合影像與骨架

我把『C#.Net 使用WPF開發KINECT』與『C#.Net 分析KINECT追蹤骨架』所學到的東西做一個整合。
也就是將骨架結合影像,順便來衝篇數XDDD

結合後可以幹嗎?就可以用一把光劍啊,或者讓使用者測試衣服是否符合自己的需求等等的功能

C#.Net 分析KINECT追蹤骨架

目前可以追蹤的骨架如下圖,約20個

KINECT的骨架偵測點主要是以SPINE這個點為主,偵測到這個點才會開始判斷其他點的位置


距離太近就有可能會出現判斷方向相反,在測試時就有可能發生左腳被偵測到右腳去了,右腳跑來左腳的位置…


2013/05/11

C#.Net 使用WPF開發KINECT

決定幫學長寫這個程式了,也是因為國科會案子的展示大致上今年應該OK了,剩下明年展完也差不多要畢業了。

2009年6月,我知道這個東西後其實還蠻感興趣的。約2010就有推出Develop的網站,有分32bit和64bit的版本,親戚有購買XBOX360用的KINECT,不過不好意思跟親戚借來開發程式,後來就做罷了。其實我有偷偷拿來玩過XDDD


不過當初還有研究相關KINECT架構以及人體關節,也就是因為這樣對於影像辨識這塊非常的感興趣,不過技術技術說破就不值錢了。

當初最夯的Souce code應該是光劍吧?


微軟也推出切水果的一個遊戲,當初還蠻轟動的。