Web Browser’a Speech Recognition ile Sesli Komut Bölüm2
Selamlar Arkadaşlar;
Önceki makalede kaldığımız yerden devam ediyoruz.
Aşağıda sizden gelen yoğun istek üzerine projenin esas amacını gösteren bir video bulunmaktadır. Umarım sizde benim kadar keyif alırsınız.
İsterseniz şimdi kodlamaya devam edelim.
recognizer_SpeechRecognized() methodunda kullandığımız komutlara devam ediyoruz.
“what time is it” komutu ile aşağıda görüldüğü gibi o anki saat bilgisi çekilir. Ve makinaya söyletilir.
1 2 3 4 5 6 |
else if (e.Result.Text == "what time is it") { SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak(DateTime.Now.ToShortTimeString(), svsp); } |
“temperature“: Komutunda aşağıda görüldüğü gibi ilgili url’e watin(watin ile ilgili makaleye buradan ulaşabilirsiniz.) sayesinde gidilip ilgili alanlar pars edilerek İstanbul için anlık sıcaklık bilgisi çekilip yazdırılır ve söyletilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
else if (e.Result.Text == "temperature") { ie = new IE("http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m=ISTANBUL"); ie.Visible = false; ie.WaitForComplete(); if (ie != null) { label3.Text = ie.Div(Find.ById("divSonDurum")).Tables[0].TableRows[1].TableCells[1].Text; label3.Visible = true; label2.Visible = true; SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak(label3.Text, svsp); } ie.Close(); ie.Dispose(); } |
“Get Money“: Komutunda aşağıda görüldüğü gibi merkez bankasına gidilip today.xml çekilerek xpath ile ilgili kurlar pars edilmektedir. Daha sonra sonuçlar hem yazdırılmakta hem de makinaya söyletilmektedir. Proxy olan serverlar için yazılması gereken kodlar pasif olarak aşağıda belirtilmiştir..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
else if (e.Result.Text == "Get Money") { System.Net.WebRequest req = System.Net.WebRequest.Create("http://www.tcmb.gov.tr/kurlar/today.xml"); //req.Proxy = new System.Net.WebProxy("172.20.164.50:8080", true); //req.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; System.Net.WebResponse resp = req.GetResponse(); System.IO.StreamReader textReader = new System.IO.StreamReader(resp.GetResponseStream()); System.Xml.XmlTextReader xmlReader = new System.Xml.XmlTextReader(textReader); System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); xmlDoc.Load(xmlReader); System.Xml.XmlNode euroAlis = xmlDoc.SelectSingleNode("//Tarih_Date//Currency[@Kod='EUR']//ForexBuying"); System.Xml.XmlNode dolarAlis = xmlDoc.SelectSingleNode("//Tarih_Date//Currency[@Kod='USD']//ForexBuying"); SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("One Turkish lira " + dolarAlis.ChildNodes[0].InnerText + "$", svsp); spVoice.Speak("One Turkish lira " + euroAlis.ChildNodes[0].InnerText + "€", svsp); label4.Text = "1 ytl =" + dolarAlis.InnerText + "$"; label4.Visible = true; label5.Text = "1 ytl =" + euroAlis.InnerText + "€"; label5.Visible = true; } |
“Get Movies“: Komutunda aşağıda görüldüğü gibi beyazberde.com’a gidilerek vizyondaki filmler segmesi clicklenip imageleri belli kriterlerde olan film isimleri listbox’a doldurulmaktadır. İşleme başlamadan önce yapılacağına dair bir sesli mesaj verilmekte ve işlem bitince gene işlemin bittiğine dair sesli bir mesaj ile kullanıcı bilgilendirilmektedir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
else if (e.Result.Text == "Get Movies") { SpVoice spVoice2 = new SpVoice(); SpeechVoiceSpeakFlags svsp2 = new SpeechVoiceSpeakFlags(); spVoice2.Speak("Ok I am Looking for Movies", svsp2); ie = new IE("http://www.beyazperde.com/"); ie.Visible = false; ie.Link(Find.ByText("Vizyondaki Filmler")).WaitUntilExists(); ie.Link(Find.ByText("Vizyondaki Filmler")).ClickNoWait(); ie.Div(Find.ById("col_main")).WaitUntilExists(); if (ie != null) { ElementCollection image = ie.Div(Find.ById("col_main")).ElementsWithTag("img"); var x = from obj in image where obj.GetAttributeValue("alt") != null && obj.GetAttributeValue("alt").Trim() != "" select obj; IEnumerator<Element> enumerator = x.GetEnumerator(); // IEnumerable dan dolayi SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); int i = 1; while (enumerator.MoveNext()) { listBox1.Items.Add(i.ToString() + "-)" + enumerator.Current.GetAttributeValue("alt")); i++; } spVoice.Speak("Movies All Load", svsp); listBox1.Visible = true; label6.Visible = true; } ie.Close(); ie.Dispose(); } |
“Open Yahoo“: Komutunda watin sayesinde explorer browser’da yahoo açılıp, search kısmına aşağıda görüldüğü gibi odaklanılır.
1 2 3 4 5 6 7 8 |
else if (e.Result.Text == "Open Yahoo") { ie = new IE("http://www.yahoo.com/"); if (ie != null) { ie.TextField(Find.ByName("p")).Focus(); } } |
“IPAD search“: Komutu ile explorerda açılan yahoo browser’ın search kısmına IPAD yazılıp, arama butonuna aşağıda görüldüğü gibi basılır.
1 2 3 4 5 6 7 8 |
else if (e.Result.Text == "IPAD search") { if (ie != null && ie.NativeBrowser != null) { ie.TextField(Find.ByName("p")).Value = "IPAD"; ie.Button(Find.ById("search-submit")).Click(); } } |
“Open Garanti” ve “Garanti Enter“: Komutlarında aşağıda görüldüğü gibi garanti bankası sitesine resmi giriş yapıldıktan sonra, müşteri numarası ve password alanları doldurulup giriş tuşuna basılır. Sonraki adımda Resim onay tuşuna basılır. Daha sonra cep telefonuna gelen mesaj sesli bir şekilde okununca garanti sayfasındaki ilgili mobile password alanı doldurulur ve “Garanti Enter ” komutu ile giriş tuşuna basılır. Böylece Garanti Hesap ekranına erişilir..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
else if (e.Result.Text == "Open Garanti") { ie = new IE("https://isube.garanti.com.tr/isube/login/login/passwordentrypersonal-tr"); if (ie != null) { ie.WaitForComplete(100000); ie.TextField(Find.ById("custno")).Value = "xxxxxx"; ie.TextField(Find.ById("password")).Value = "xxxxxx"; ie.Span(Find.ByText("İnternet Şubesi Giriş")).Click(); ie.WaitForComplete(100000); ie.Span(Find.ByText("Onay")).Click(); ie.WaitForComplete(100000); ie.TextField(Find.ById("smsSifreSahasi")).Focus(); } } else if (e.Result.Text == "Garanti Enter") { ie.Span(Find.ByText("İnternet Şubesi Giriş")).Click(); } |
“Open Bora“: Komutunda watin ile explorer açılıp borakasmer.com’a aşağıda görüldüğü gibi gidilir.
1 2 3 4 5 6 7 8 |
else if (e.Result.Text == "Open Bora") { ie = new IE("http://www.borakasmer.com/"); if (ie != null) { } } |
“Kapat Ex” : Komutu ile açılan Explorer Browser kapatılır.
1 2 3 4 5 6 7 8 |
else if (e.Result.Text == "Kapat Ex") { if (ie != null) { ExLearnLink = false; ie.Close(); } } |
“mouse down“,”mouse up“,”mouse left“,”mouse right” komutları ile mouse aşağı, yukarı, sola ve sağa hareket ettirilir.
“stop” komutu ile hareket eden mouse durdurulur.
“Push Button” ile mouse’un sol tuşu tıklanır.
“Faster” komutu ile hareket eden mouse hızlandırılır.
İlgili kodlar aşağıda görüldüğü gibidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
else if (e.Result.Text == "mouse down") { position = 0; timer3.Start(); } else if (e.Result.Text == "mouse up") { position = 1; timer3.Start(); } else if (e.Result.Text == "mouse left") { position = 2; timer3.Start(); } else if (e.Result.Text == "mouse right") { position = 3; timer3.Start(); } else if (e.Result.Text == "Stop") { faster = false; link_counter = 0; link = ""; timer3.Stop(); } else if (e.Result.Text == "Push Button") { DoMouseClick(); } else if (e.Result.Text == "Faster") { faster = true; } |
“Ex Max“: Komutu ile açılan explorer browser’ı ekranı kaplatılır.
“Ex Min“: Komutu ile açılan explorer browser’ı aşağı alınır.
“Ex Up“,”Ex Down“: Komutları ile açılan explorer browser’ında scroll aşağı ve yukarı hareket ettirilir.
“Ex Stop“: Komutu ile açılan explorer browser’ında hareket eden scroll durdurulur.
“Ex Up Faster” ve “Ex Down Faster“: Komutları ile açılan explorer browser’ında yukarı veya aşağı hareket ettirilen scroll hızlandırılır.
“Ex Back” ve “Ex Forward“: Komutları ile açılan explorer browser’ında geri ve ileri sayfalara geçilir. Geçiş sırasında öğrenme fonksiyonu açık ise ilgili sayfalar için de tüm linkler öğrenilir. Öğrenme konusuna ilerde detaylı olarak değinilecektir.
İlgili kodlar aşağıda görüldüğü gibidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
else if (e.Result.Text == "Ex Max") { if (ie != null && ie.NativeBrowser != null) ie.ShowWindow(NativeMethods.WindowShowStyle.Maximize); } else if (e.Result.Text == "Ex Min") { if (ie != null && ie.NativeBrowser != null) ie.ShowWindow(NativeMethods.WindowShowStyle.Minimize); } else if (e.Result.Text == "Ex Down") { wheelPosition = 0; timer4.Start(); } else if (e.Result.Text == "Ex Up") { wheelPosition = 1; timer4.Start(); } else if (e.Result.Text == "Ex Stop") { wheelPosition = 4; } else if (e.Result.Text == "Ex Down Faster") { wheelPosition = 2; timer4.Start(); } else if (e.Result.Text == "Ex Up Faster") { wheelPosition = 3; timer4.Start(); } else if (e.Result.Text == "ex back") { ie.Back(); if (ExLearnLink == true) { ie.WaitForComplete(); Explorer_Learn(); } } else if (e.Result.Text == "ex forward") { ie.Forward(); if (ExLearnLink == true) { ie.WaitForComplete(); Explorer_Learn(); } } |
Geldik en önemli komutlara:
“Learn” : Hatırlarsanız speech recognition’da söylenen komutların var olan komutlar ile karşılaştırılıp bulanacağı bir kütüphane gerekmektedir. Bunun üzerinden gidersek açılan webBrowser daki bir link’in söylenince tıklanabilmesi için ilgili textin önceden kütüphane’ye eklenmesi gerekir. Böylece herhangi bir link’in text’i komut olarak sisteme geldiği zaman ilgili kütüpahaneden eğer linkler içerisin eşleşen olur ise tıklanarak ilgili adrese gidilir. Bunu için “Learn” komutunda açılan webBrowser’daki tüm linkler gezilerek aynı olan linklerin ve boş olan linklerin birdaha eklenmemesi koşulu ile ilgili linklerin text’i Choices olarak belirlediğimiz nesnemize ordan da Grammer objectimize doldurulur. htable nesnemize text değeri için link’in text’i value değeri içinde link’in url’i aşağıda görüldüğü gibi kaydedilir.
“Don’t Learn”: İlgili webBrowser’da açık olan sayfadaki linkler unutturulur. Yani kütüphaneden aşağıda görüldüğü gibi silinir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
else if (e.Result.Text == "Learn") { LearnLink = true; var links = from obj in webBrowser1.Document.All.OfType<HtmlElement>() where obj.TagName == "A" select obj; if (links != null && links.Count() > 0) { Choices choices = new Choices(); if (htable == null) htable = new System.Collections.Hashtable(); else if (htable.Count > 0) htable.Clear(); foreach (HtmlElement he in links) { if (he.InnerText != null && he.InnerText.Trim() != "" && htable.Contains(he.InnerText.Trim()) == false) { try { htable.Add(he.InnerText.Trim(), ((IHTMLAnchorElement)he.DomElement).href); } catch (Exception ex) { } //spVoice.Speak(he.InnerText.Trim(), svsp); choices.Add(he.InnerText.Trim()); } } GrammarBuilder grammarBuilder = new GrammarBuilder(choices); grammarBuilder.Culture = System.Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag("en-US"); Grammar grammar = new Grammar(grammarBuilder); if (recognizer.Grammars.Count > 1) { for (int i = 1; i <= recognizer.Grammars.Count; i++) { recognizer.UnloadGrammar(recognizer.Grammars[i]); } } recognizer.LoadGrammar(grammar); } } else if (e.Result.Text == "Don't Learn") { LearnLink = false; if (recognizer.Grammars.Count > 1) { for (int i = 1; i <= recognizer.Grammars.Count; i++) { recognizer.UnloadGrammar(recognizer.Grammars[i]); } } } |
“Ex Learn”: Aynı “Learn” komutu nasıl webBrowser için çalışıyor ise “Ex Learn“‘de watin ile açılan tüm Explorer browser içindeki linklerin texler’i öğrenilir ve library’e eklenir. Ayrıca diğer sayfalara geçişlerde de öğrenme işlemi her açılan explorer penceresi için Explorer_Learn() methodu ile otomatik olarak yapılır. İşleme başlamadan önce kullanıcı sesli olarak “Ok I am Learnnig” şeklinde bilgilendirilir. htable nesnemize text değeri için link’in text’i value değeri için ise “Learn” komutundan farklı olarak boş “” string değeri aşağıda görüldüğü gibi atılır. Nedenini ileride tartışacağız.
“Ex Don’t Learn” : Aynı “Don’t Learn” komutunda olduğu gibi burda da webBrowser için değil açılan explorer browser içindeki öğrenilen linkler library’den çıkarılır ve gidilecek diğer explorer browser ekranlarında, ilgili sayfadaki linkleri öğrenme işlemi yapılmaz. İşleme başlamadan önce kullanıcı sesli olarak “I Forget Everything” şeklinde aşağıda görüldüğü gibi bilgilendirilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
else if (e.Result.Text == "Ex Learn" && ie != null && ie.NativeBrowser != null) { if (ie.Links != null && ie.Links.Count > 0) { SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("Ok I am Learning", svsp); Choices choices = new Choices(); if (htable == null) htable = new System.Collections.Hashtable(); else if (htable.Count > 0) htable.Clear(); foreach (Link li in ie.Links) { if (li.Text != null && li.Text.Trim() != "" && htable.Contains(li.Text.Trim()) == false) { try { htable.Add(li.Text.Trim(), null); } catch (Exception ex) { } //spVoice.Speak(he.InnerText.Trim(), svsp); //choices.Add(li.Text.Trim().Trim()); choices.Add(li.Text.Trim().Trim().Replace("\"", "'")); } } GrammarBuilder grammarBuilder = new GrammarBuilder(choices); grammarBuilder.Culture = System.Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag("en-US"); Grammar grammar = new Grammar(grammarBuilder); if (recognizer.Grammars.Count > 1) { for (int i = 1; i <= recognizer.Grammars.Count; i++) { recognizer.UnloadGrammar(recognizer.Grammars[i]); } } recognizer.LoadGrammar(grammar); spVoice.Speak("Page is Learnd.", svsp); ExLearnLink = true; } } else if (e.Result.Text == "Ex Don't Learn") { ExLearnLink = false; SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("I Forget Everything", svsp); if (recognizer.Grammars.Count > 1) { for (int i = 1; i <= recognizer.Grammars.Count; i++) { recognizer.UnloadGrammar(recognizer.Grammars[i]); } } } |
“Ex Back” ve “Ex Forward” komutlarında geçiş yapılan sayfada duruma göre linklerin öğrenilmesi gerekiyor ise Explorer_Learn() methodu çağrılarak ilgili linklerin textleri library’e eklenir.İşleme başlamadan önce kullanıcı “Wait For Learning” şeklinde aşağıda görüldüğü gibi bilgilendirilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
public void Explorer_Learn() { //Yeni Sayfayı Öğrenme if (ie.Links != null && ie.Links.Count > 0) { SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("Wait For Learning", svsp); Choices choices = new Choices(); if (htable == null) htable = new System.Collections.Hashtable(); else if (htable.Count > 0) htable.Clear(); foreach (Link li in ie.Links) { try { if (li.Text != null && li.Text.Trim() != "" && htable.Contains(li.Text.Trim()) == false) { htable.Add(li.Text.Trim(), null); //spVoice.Speak(he.InnerText.Trim(), svsp); //choices.Add(li.Text.Trim().Trim()); choices.Add(li.Text.Trim().Trim().Replace("\"","'")); } } catch (Exception ex) { int i = 0; } } Grammar grammar=null; try { GrammarBuilder grammarBuilder = new GrammarBuilder(choices); grammarBuilder.Culture = System.Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag("en-US"); grammar = new Grammar(grammarBuilder); } catch (Exception ex) { int i = 0; } if (recognizer.Grammars.Count > 1) { for (int i = 1; i <= recognizer.Grammars.Count; i++) { try { recognizer.UnloadGrammar(recognizer.Grammars[i]); } catch (Exception ex) { int s = 0; } } } recognizer.LoadGrammar(grammar); spVoice.Speak("Page is Learnd", svsp); } //-------------------------------- } |
“Shout Up“: Komutu makinanın her işlemden önce kullanıcıyı bilgilendirmesini aşağıda görüldüğü gibi sonlandırır.
“Say Load“: Komutu makinanın her işlemden önce kullanıcıyı tekrardan bilgilendirmesini aşağıda görüldüğü gibi sağlar.
1 2 3 4 5 6 7 8 |
else if (e.Result.Text == "Shout Up") { sayPageLoad = false; } else if (e.Result.Text == "Say Load") { sayPageLoad = true; } |
“Run Notepad” ve “Kapat Notepad“:Komutları Notepad uygulamasının açılmasını ve kapatılmasını aşağıdaki görüldüğü gibi sağlar.
“Run Paint” ve “Kapat Paint“: Komutları Paint uygulamasının açılmasını ve kapatılmasını aşağıda görüldüğü gibi sağlar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
else if (e.Result.Text == "Run Notepad") { Process.Start("notepad.exe"); } else if (e.Result.Text == "Run Paint") { Process.Start("mspaint.exe"); } else if (e.Result.Text == "Kapat Notepad") { Process pro; pro = Process.GetProcessesByName("notepad")[Process.GetProcessesByName("notepad").Count() - 1]; pro.Kill(); } else if (e.Result.Text == "Kapat Paint") { Process pro; pro = Process.GetProcessesByName("mspaint")[Process.GetProcessesByName("mspaint").Count() - 1]; pro.Kill(); } |
“Boya” ve “No Boya“: Komutları özellikle paint uygulamasında kullanmak üzere mouse’un sol tuşunun basılı kalmasını veya tuşun bıraklımasını aşağıda görüldüğü gibi sağlar. Sol tuşun basılı kalması ile paint uygulamasında çizim yapılabilir. Yine sol tuşun basılması bırakılarak çizim işlemine son verilebilir.
1 2 3 4 5 6 7 8 |
else if (e.Result.Text == "Boya") { DoMousePressed(); } else if (e.Result.Text == "No Boya") { DoMouseUnPressed(); } |
Son ve en önemli konu olarak aşağıda görüldüğü gibi söylenen komut eğer Library’deki hiçbir komut ile örtüşmüyorsa, öğrenilen linklerin textlerine bakılır. Eğer örtüşen linklerin value’leri var ise bu linkler “Learn” komutu ile doldurulmuşlardır ve windows form’daki webBrowser üzerindeki bir link’i, temsil etmektedirler. Buna göre windows form’daki webBrowser’ın url’ine söylenen link’in value değeri atanır ve böylece ilgili adrese yönlendirilir. Eğer value değeri boş ise “Ex Learn” komutu ile dolmuş demektir. Buda açılan explorer browser’ın üzerindeki bir link’i işaret etmektedir. Linq query ile söylenen link text değerinden bulunup explorer üzerinde clicklenir. Ve browser ilgili url’e yönlendirilir. Eğer ilgili Linkin Text’i “Yahoo! Mail” veya “Mail” ise Mail sayfası için username ve password alanları doldurulup giriş tuşuna basılarak yahoo mail’in ana sayfasına erişilir. İlgili kodlar aşağıdaki gibidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
else { foreach (System.Collections.DictionaryEntry dt in htable) { if (e.Result.Text == dt.Key.ToString()) { if (dt.Value != null) webBrowser1.Url = new Uri(dt.Value.ToString()); else { ie.Link(Find.ByText(dt.Key.ToString())).Click(); if (ExLearnLink == true && (e.Result.Text != "Yahoo! Mail" && e.Result.Text != "Mail"))//Yahoo'da maillere girilmişe link yüklemesi sayfa otamatik açılsın diye. { ie.WaitForComplete(); Explorer_Learn(); } if (e.Result.Text == "Yahoo! Mail" || e.Result.Text == "Mail" || e.Result.Text == "Sign In") { ie.WaitForComplete(); ie.TextField(Find.ByName("login")).Value = "xxxxxxx"; ie.TextField(Find.ByName("passwd")).Value = "xxxxxxx"; ie.Button(Find.ByName(".save")).Click(); if (ExLearnLink == true) { ie.WaitForComplete(); Explorer_Learn(); } } } break; } } } |
Uygulamada yukarıda görüldüğü gibi 4 tane timer vardır. Gelin şimdi timerların ne işe yaradığına bakalım.
Timer1: Textbox2′ nin” Line” komutu ile textbox1 yanına gelmesi aşağıdaki görüldüğü gibi sağlar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
private void timer1_Tick(object sender, EventArgs e) { if (textBox2.Location.X < 159) { int x = textBox2.Location.X; int y = textBox2.Location.Y; textBox2.Location = new Point(x + 1, y); } if (textBox2.Location.Y > 12) { int x2 = textBox2.Location.X; int y2 = textBox2.Location.Y; textBox2.Location = new Point(x2, y2 - 1); } if (textBox2.Location.Y <= 12 && textBox2.Location.X >= 159) timer1.Stop(); } |
Timer2: Textbox2′ nin “Rahat” komutu ile textbox1 altına hareket etmesini aşağıda görüldüğü gibi sağlar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
private void timer2_Tick(object sender, EventArgs e) { if (textBox2.Location.X > 12) { int x = textBox2.Location.X; int y = textBox2.Location.Y; textBox2.Location = new Point(x - 1, y); } if (textBox2.Location.Y < 38) { int x2 = textBox2.Location.X; int y2 = textBox2.Location.Y; textBox2.Location = new Point(x2, y2 + 1); } if (textBox2.Location.Y >= 38 && textBox2.Location.X <= 12) timer2.Stop(); } |
Timer3: “Mouse Up“,”Mouse Down“, “Mouse Left” , “Mouse Right“, “Faster” ve “Stop” komutlarında mouse’ın belirtilen komut yönünde hareket etmesini, hızlanmasını veya durmasını aşağıda görüldüğü gibi sağlar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
int wheelPosition = 0; int position = 0; bool faster = false; string link = ""; int link_counter = 0; string link2 = "";//Watin int link_counter2 = 0;//Watin private void timer3_Tick(object sender, EventArgs e) { timer4.Stop();//web oratamında scroll durur çünkü mouse ortada olması şartlanıyo harekette. int speed = 5; if (faster == true) speed = 20; timer3.Interval = 100; if (link == webBrowser1.StatusText && link_counter < 3 && link.Trim() != "" && faster == false) { timer3.Interval = 400; speed = 1; link_counter++; } else if (link != webBrowser1.StatusText && link.Trim() != "" && faster == false) { timer3.Interval = 400; speed = 1; link_counter = 0; } //WatiN içi if (ie != null && ie.NativeBrowser != null) { try { if (link2 == ((WatiN.Core.Native.InternetExplorer.IEBrowser)ie.NativeBrowser).WebBrowser.StatusText && link_counter2 < 3 && link2.Trim() != "" && faster == false) { timer3.Interval = 400; speed = 1; link_counter2++; } else if (link2 != ((WatiN.Core.Native.InternetExplorer.IEBrowser)ie.NativeBrowser).WebBrowser.StatusText && link2.Trim() != "" && faster == false) { timer3.Interval = 400; speed = 1; link_counter2 = 0; } link2 = ((WatiN.Core.Native.InternetExplorer.IEBrowser)ie.NativeBrowser).WebBrowser.StatusText; //WatiN içi bitti --------------- } catch(Exception ex) { } } //this.Text = speed.ToString() + ":" + webBrowser1.StatusText; link = webBrowser1.StatusText; if (position == 0) { Point pt = Cursor.Position; pt.Y += speed; Cursor.Position = pt; } else if (position == 1) { Point pt = Cursor.Position; pt.Y -= speed; Cursor.Position = pt; } else if (position == 3) { Point pt = Cursor.Position; pt.X += speed; Cursor.Position = pt; } else if (position == 2) { Point pt = Cursor.Position; pt.X -= speed; Cursor.Position = pt; } } |
Timer4: Windows Form’daki webBrowser’da yada açılan explorer browser’ı üzerinde “Scroll Down“, “Scroll Up“, “Scroll Stop“, “Faster Down“, “Faster Up“, “Ex Down” , “Ex Up“, “Ex Up Faster” , “Ex Down Faster” ve “Ex Stop” komutları ile scrollun aşağı, yukarı hareket etmesini, hızlanmasını veya durmasını aşağıda görüldüğü gibi sağlar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
private void timer4_Tick(object sender, EventArgs e) { if (wheelPosition == 0) { DoMouseWheelDown(1); } if (wheelPosition == 1) { DoMouseWheelUp(1); } if (wheelPosition == 2) { DoMouseWheelDown(2); } if (wheelPosition == 3) { DoMouseWheelUp(2); } if (wheelPosition == 4) { DoMouseWheelUp(0); } } |
Son olarak Windows Form’daki webBrowser ilgili Url’e yönlenip yükleme işlemi tamamlandığında koşula göre ilgili linklerin öğrenilmesi ve kullanıcıya bilgi verilmesi gibi işlemlerin yapıldığı kısım aşağıdaki gibidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
int SayCount = 0; System.Collections.Hashtable htable; bool LearnLink = false; bool ExLearnLink = false; bool sayPageLoad = true; private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (SayCount > 5) SayCount = 0;//Güvenlik amaçlı 5 den büyük framelilerde yüklemesin.Bazen değerler artıyo if (SayCount == webBrowser1.Document.Window.Frames.Count) { if (sayPageLoad == true)//Sayfanın yüklendiğini söyler.. { SpVoice spVoice = new SpVoice(); SpeechVoiceSpeakFlags svsp = new SpeechVoiceSpeakFlags(); spVoice.Speak("Page is Loaded.", svsp); } SayCount = 0; if (LearnLink == true)//Öğrenilmesi isteniyosa(Girdiği sitedeki linkleri öğrenir. { var links = from obj in webBrowser1.Document.All.OfType<HtmlElement>() where obj.TagName == "A" select obj; if (links != null && links.Count() > 0) { Choices choices = new Choices(); if (htable == null) htable = new System.Collections.Hashtable(); else if (htable.Count > 0) htable.Clear(); foreach (HtmlElement he in links) { if (he.InnerText != null && he.InnerText.Trim() != "" && htable.Contains(he.InnerText.Trim()) == false) { try { htable.Add(he.InnerText.Trim(), ((IHTMLAnchorElement)he.DomElement).href); } catch (Exception ex) { } //spVoice.Speak(he.InnerText.Trim(), svsp); choices.Add(he.InnerText.Trim()); } } GrammarBuilder grammarBuilder = new GrammarBuilder(choices); grammarBuilder.Culture = System.Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag("en-US"); Grammar grammar = new Grammar(grammarBuilder); if (recognizer.Grammars.Count > 1) { for (int i = 1; i <= recognizer.Grammars.Count; i++) { recognizer.UnloadGrammar(recognizer.Grammars[i]); } } recognizer.LoadGrammar(grammar); } } } else SayCount++; } |
Sonuç olarak yukarıdaki örnekde de görüldüğü gibi ses teknolojileri ile birlikte bilgisayarlarla olan etikleşim bambaşka bir boyut kazanmaktadır. İlerki bir dönemde klavye, mouse veya digital write pen gibi birçok araç ortadan kalkacaktır. Yerini hareket ve sesi algılayan kinect gibi toolar yer alacaktır.
Siz de bu teknolojiyi daha farklı nasıl kullanabileceğimizi ve bize olan faydalarını düşünüp, benimle paylaşırsanız sevinirim.
Yeni bir makalede görüşmek üzere hoşçakalın.
Hocam Elinize Sağlık;
Yok artık diyorum başka birşey diyemiyorum. Daha nereye bu teknoloji götürülebilir bilmiyorum. Ama siz herhalde bir 10 yıl ileriye götürmüşünüz :)
Hocam Elinize sağlık;
Ben de lambadan sonra bu kadarını beklemiyordum. Burdaki arkadaşlar da tabiri caizse dilini yuttu. En kısa zamanda kodları tek tek yazıp bizde bunu deniyeceğiz. Şu ana kadar izlediğim en baba yazlım üzerine olan teknoloji videolarından biri idi. Her türlü eventinize ben ve arkadaşlarım katılmak isteriz. İyi ki varsınız.
Yok artık lebron james hocam.
Elinize sağlık . Daha ne denebilir ki:)
Hocam, cok guzel. Su projenin kaynak dosyalarni (vs) paylasa bilirmisiniz ? isterseniz mailime yollayin :) Tesekkurler
Hocam, çox güzül bir çalışma. Lütfen, bu projenin kaynak dosyalarını (visual studio) paylaşa bilirmisiniz? Mailime-de yollaya bilirsiniz. Bazı sorunlardan dolayı, kodları tam olarak yazamıyorum. Teşekkür ederim.
Selam Alekber,
Baya bir zaman önce idi. Ama en kısa zamanda bakarım. Tam düzgününü bulur isem sana dönerim..
Lütfen hocam, kaynak dosyalarını paylaşırsanız yada mailime yollarsanız çox iyi olur. Çok ihtiyyacım var, buna. Digerleri olmazsada olur, bana gerekli olan asıl 2 şey var. 1. Sesli komut ile, mouse(cursoru yani)-yi kontrol etmek. 2. Sesli komut ile, Web Browseri kontrol etmek.
Selam Alekber;
Projeyi malesef şu anda paylaşamıyacam. Çünkü bendekinde de sorun var. Ama sirket sunucularında yedeği vardı. Ordan bulunca sana mail atıcam…
İyi çalışmalar.
Lütfen hocam, lütfen…. Söyledigim gibi, çox ihtiyacım var buna. Sabırsızlıkla bekliyorum hocam. Teşekkür ederim, ilginiz için.
Hocam merhaba. Ne oldu, buldunuzmu?
Selamlar,
Malesef ses Dll’ini paylaşamıyacağım. Halen hakları şirket üzerine kayıtlı imiş.
Kusura bakmayın. Zamanım olduğu zaman yeni bir tane geliştirip, ilk sizinle paylaşacağım:) Olmadı siz de birtane yazın. Bana istediğinizi sorabilirsiniz.
İyi çalışmalar.
Hocam, bana ses DLL-i gerek diilki )) Ben, sesli komutları vermeyi filan hepsini yapdım. İngilizcede anlıyor beni güzel ve kodladığım şekilde işini görüyor. Tek yapamadığım 2 şey var.Şu ki, ses ile mouseyi (cursornu – sizin videonuzdaki gibi) kontrol etmek istiyorum, ama yapamıyorum. Birde, ses ile Web Browseri kontrol edemiyorum(sizin videodaki gibi, proqrama bi veb brovser gömemiyorum, vs-nın kendi brovseri hariç). Bu 2-si gerek bana yalnızca. Nasıl yapayım? :) Teşekkürler.
Selam Alekber;
Bana mail atarsan ona dönüş yaparım. Aslında makalede hepsini anlatmıştım:)
İyi çalışmalar.
Evet hocam, anlatmışsınız. Ama, malesef yinede yapamadım. Bana sadece, o sölediklerim olan bir proje gerek. Öyle bişeyin, kaynak dosyalarnı istiyordum yani.
Mailinizi bilmiyorum.
Selam Alekber,
Mail adresim : http://www.borakasmer.com/hakkimda/ buradan iletişim bilgilerime erişebilirsin. Sadece istediğin kısımları haftasonu bakabilirim.
Ona biraz zaman ve emek harcamam gerekiyor…
Merhaba hocam.
Hocam, mail adresinize mesaj yazdım. Teşekkür ederim.
Merhaba hocam.
Hocam, mail adresinize mesaj yazdım. Baktınızmı? Sabırsızlıkla bekliyorum.
Hocam merhaba. Ne oldu hocam? Geri donusunuz olmadi :((
Selam, Bora hocam. Lütfen, bi cevab yazın zahmet olmazsa. Hocam, bekliyorum projeyi. Zaman ayırırmısınız lütfen. :((
Selam Alekber;
Yeni makina kurdum. Anca disklerden kodlari alip alip atiyorum. Bulunca aticam. Yarin ozellikle ariyacagim.
Iyi aksamlar.
Tamam hocam. Lütfen, çok önemli. Söyledigim gibi, digerleri gerek deyil. Sadece, ses ile mouseyi (cursornu – sizin videonuzdaki gibi) kontrol etmek ve ses ile Web Browseri kontrol etmek (sizin videodaki gibi, proqrama bi veb brovser gömemiyorum, vs-nın kendi brovseri hariç). Bu 2-si gerek bana yalnızca. Teşekkür ediyorum hocam.
– Hocam, ses ile, Web browseri kontol etmek olmazsada olur. En önemlisi, ses ile mouseyi (cursornu – sizin videonuzdaki gibi) kontrol etmek gerek bana.
Selam, Bora hocam. Nasilsiniz?. Hocam, aradinizmi bu gun? Bulabildinizmi birsey? :)
Selam Alekber. Buldum ama calismadilar:( Sonucta Windows Kernel kullaniyorlar.. Bu da windows 10 …
Hocam cok iyi. Siz o dosyalari bana yollaya bilirmisiniz? Lütfen. Bende Windows 8.1. Bir problemi olmaz bence. Windows 7-de calissa bile yeter.Ne olursa olsun, siz bulduklarinizi yollayin zahmet olmazsa. Bu arada, hocam çok sevindim buldugunuz için.
Hocam, merhaba. Siz bulduklariniz bana yollayarmisiniz? Lutfen. Calismazsada bana yeter. Bana zaten windows 10-da calismasi gerek deyil.
Hocam, merhaba. Siz bulduklariniz bana yollayarmisiniz? Lutfen. Calismazsada bana yeter. Bana zaten windows 10-da calismasi gerek deyil. Bekliyorum hocam.
Bora hocam, birdaha merhaba. Lutfen, bi kez bakin. Hocam, buldugunuz dosyalari yollaya bilirmisniz? Lutfen.
Bora hocam, birdaha merhaba. Lutfen, bi kez bakin. Hocam, buldugunuz dosyalari yollaya bilirmisniz? Lutfen. Benden baska herkes ile ilgileniyorsunuz.
Eline Sağlık Hocam :)
Teşekkürler Ali…
çok güzel helal olsun
Selam Can,
Çok teşekkür ederim Can. Bu bir makaleden ziyade aylar süren bir çalışmanın eseridir. Tek amacı özürlü çocuklara bilgisayar kullandırabilmektir ve tamamen gönül işidir.
Sadece böyle bir yazı ile de başarıya ulaşmış bir işi, paylaşmak istedim.
hocam size bir sorum olucak kendi kodladığım elimde az komutlu olsa da bir program var bilgisayardan istediğim dosyayı açtırıyorum kelimelerimin karşılığını da alıyorum fakat sizin gibi internette gezinemiyorum bu konu hakkında yardımcı olurmusunuz kod mantığını hala anlamış değilim verdiğiniz kodları da anlamadığım için kullanamıyorum yardımcı olursanız çok sevinirim
Selam Yasin,
Öncelikle yaptığın adımlar için seni tebrik ederim.
Benim kodları ancak sanırım birebir anlatmamdan başka bir yol görülmüyor. Uzaktan, anlamadığın kodları anlatmak çok zor gibi :)
İyi çalışmalar.
Eğer birebir verme şansınız varsa oda kabulüm. :) Ama bana en azından bir yol gösterirseniz gerçekten çok işime yarayacak hani bana buraya buraya odaklan demeniz yeterli hocam
Bora hocam selamlar,
Türkçe karakterlerde sorun yaşanıyor ve her zaman algılamıyor alternatif olarak ne düşünebiliriz. Mesala Çiftçi, Çekoslavakya gibi okunması ve algılanması zor olanlarda ne gibi alternatiflere yönelebiliriz.
Selamlar,
Maalesef bu kullandığın kütüphane ile alakalı. Türkçe’ye daha uygun milli kütüphaneleri deniyebilirsin. Ama ücretliler haberin olsun :)
İyi çalışmalar.
Merhaba ie’ yi nerede tanımladınız acaba ne oldugunu anlayamadım bir türlü
Selamlar,
Tanımlamadım WatIn ile birlikte geliyor..
Ben watin core’u ekleyince form kelimesinin altını kırmızıyla çiziyor. Bunu nasıl düzeltebilirim peki yardımcı olabilir misiniz?
hocam merhaba, bilgisayarım klasörünü nasıl açtırabilirim