Сегодня 24 марта, вторник ГлавнаяНовостиО проектеЛичный кабинетПомощьКонтакты Сделать стартовойКарта сайтаНаписать администрации
Поиск по сайту
 
Ваше мнение
Какой рейтинг вас больше интересует?
 
 
 
 
 
Проголосовало: 7283
Кнопка
BlogRider.ru - Каталог блогов Рунета
получить код
Справочник по C#
Справочник по C#
Голосов: 1
Адрес блога: http://www.csharpcoderr.com/
Добавлен: 2012-11-28 00:46:26
 

Запрет на изменение раскладки клавиатуры в вашем Windows Form

2012-10-19 10:33:03 (читать в оригинале)





protected override void OnInputLanguageChanged(InputLanguageChangedEventArgs e)
{
    base.OnInputLanguageChanged(e);
    InputLanguage.CurrentInputLanguage = InputLanguage.InstalledInputLanguages[0];
}


Парсинг HTML-страниц на примере Yandex.Маркет (с HtmlAgilityPack)

2012-10-19 09:07:35 (читать в оригинале)


      Довольно часто возникает ситуация, когда в автоматическом режиме нужно получить какие-то данные со страницы в формате HTML или XHTML. Парсить можно разными способами, используя встроенные в Framework средства или сторонние библиотеки.

На сегодняшний день мне известны два способа парсинга:
с помощью регулярных выражений;
с помощью XPath.


В данной статье разберем, как можно использовать XPath для получения нужного текста.
      Предположим, что нам необходимо получить характеристики товара со страницы http://market.yandex.ua/model-spec.xml?modelid=7911905&hid=90639.
      Первая часть работы — получение html-текста страницы. Как вы его получите, — это уже второй вопрос или через WebClient, компонент браузера или загрузите файл с жесткого диска.
      Вторая часть работы сводится собственно к парсингу нужного текста. Для начала нам необходимо получить XPath к заданном элементу в структуре HTML или XHTML. Чтобы не писать все руками, открываем браузер Chrome или Firefox с плагином Firebug. В браузере F12 и попадаем в исходный код страницы. Выбираем искомый элемент и нажимаем правую кнопку мыши. В выпадающем меню выбираем Copy XPath. В Firefox по аналогии.


В результате в буфере обмена будет текст (для Chrome):

//*[@id="js"]/body/table[3]/tbody/tr/td[2]/table
Firefox:
/html/body/table[3]/tbody/tr/td[2]/table
В этом тексте описан полный путь к элементу. Но, здесь есть нужно кое-что изменить. Во первых всегда нужно убирать tbody., во вторых нет необходимости писать html или *[@id="js"], в случае с Chrome.
Нам достаточно строки:

//body/table[3]/tr/td[2]/table

Теперь берем библиотеку HtmlAgilityPack и скармливаем ей наш путь и исходный текст страницы следующим образом:

public string GetDescription(string html)
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();            
    doc.OptionFixNestedTags = true; //Опционально, если требуется
    doc.Load(new StringReader(html));
    HtmlNode node = doc.DocumentNode.SelectSingleNode("//body/table[3]/tr/td[2]/table");    
    return node.OuterHtml;
}
      В данном случае мы передаем тело html-страницы и через SelectSingleNode получаем исходный код таблицы. Обратите внимание, чтобы получить html-код найденной таблицы, необходимо использовать свойство OuterHtml. Свойство InnerHtml вернет чистый текст без тегов. Таким образом, мы на выходе метода получим таблицу, которую можно разобрать и обработать.
Все остальные данные по товару получаем по схожей схеме.


Источник http://krez0n.org.ua


Автозаполнение в WebBrowser

2012-10-19 08:48:54 (читать в оригинале)


      Данный пример показывает как легко и просто можно реализовать авто заполнение в компоненте WebBrowser. Мне данный пример пригодился для авто заполнения формы и автоматической регистрации на сайте www.masterlike.ru


      Для работы нам понадобится разместить компонент WebBrowser на форму! Теперь буду пытаться объяснить как выполнить данную задачу на примере сайта www.masterlike.ru. Вот так у него выглядит форма регистрации:

       Давайте подробнее рассмотрим что мы можем здесь заполнить автоматически, это будут все поля кроме поля ввода кода подтверждения так как он всегда разный! Теперь необходимо определить имена полей которые мы заполняем, для этого открываем браузер Chrome и переходим на нашу страничку www.masterlike.ru,после полной загрузки страницы нажимаем "F12". У нас появится дополнительное окно:
      Далее нам необходимо узнать ID первого текстового поля, ввода Логин. Для это правой клавишей мыши нажимаем на это текстовое поле и выбираем пункт "Просмотр кода элемента".
После этого мы увидим код необходимого нам текстового поля.
В этом коде нам необходим всего лишь один параметр, это id компонента:
input data-val-regex-pattern="[a-zA-Z0-9-]{1,}" data-val-regex="The field UserName must match the regular expression '[a-zA-Z0-9-]{1,}'." data-val-required="The UserName field is required." data-val="true" id="UserName" name="UserName" size="50" type="text" value=""
Для поля ввода "Логин" это будет "UserName". Теперь его необходимо заполнить:
webBrowser1.Document.GetElementById("UserName").SetAttribute("value", "csharpcoderr");
      В примере выше мы извлекли отдельный объект System.Windows.Forms.HtmlElement с использованием атрибута ID GetElementById("UserName") этого элемента в качестве поискового ключа и задали значение атрибута с заданным именем(value) в элементе.
С остальными полями поступаете так же. Единственное что нам осталось это поставить галочку "Я согласен с правилами системы". Для это мы выполняем все те же действия как и для текстового поля и получаем ID нашего checkbox.

HtmlDocument rememberme = this.webBrowser1.Document;
rememberme.GetElementById("helpbox").SetAttribute("checked", "true");       
      Думаю здесь мне уже не надо ничего обьяснять. Вот полный пример кода для заполнения формы регистрации сайта www.masterlike.ru
private void button1_Click(object sender, EventArgs e)
{
    if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
    {
        webBrowser1.Document.GetElementById("UserName").SetAttribute("value", "csharpcoderr");
        webBrowser1.Document.GetElementById("Email").InnerText = "info@csharpcoderr.com";
        webBrowser1.Document.GetElementById("Password").InnerText = "11111111";
        webBrowser1.Document.GetElementById("ConfirmedPassword").InnerText = "11111111";
        webBrowser1.Document.GetElementById("Phonecode").InnerText = "7922";
        webBrowser1.Document.GetElementById("Phone").InnerText = "7946455";

        HtmlDocument rememberme = this.webBrowser1.Document;
        rememberme.GetElementById("helpbox").SetAttribute("checked", "true");               
    }
}


Проверяем машины на доступность

2012-10-15 14:58:56 (читать в оригинале)


      Есть много утилит, чтобы помочь контролировать ваши компьютеры в сети, но что, если вам необходимо интегрировать информацию о состоянии системы в ваше собственное приложение? Допустим у вас есть список машин вашей сети и вы хотите быстро проанализировать их доступность, обычно просто открывают командную строку и выполняют команду Ping! А что если таких машин сотни или тысячи? 
      Для решения данной задачи можно воспользоваться командой Ping пространства имен System.Net.NetworkInformation.

Ping Pinger = new Ping(); 
PingReply Reply = Pinger.Send("127.0.0.1"); 

      Приведенный выше код создает новый экземпляр класса Ping, а затем отправляет пинг на локальный компьютер. Взгляните на другой пример. На этот раз вы начнете со списка компьютеров, которые должны быть проверены. Например, перебор каждого компьютера в списке, диагностика компьютера и отображение результатов. Список компьютеров может содержать либо IP-адресов(192.168.1.243) или веб-сайтов(www.google.ru) или Net-Bios имена(OAOKOMP1). Для этого примера я включил несколько внутренних систем, а также пару сайтов.

List IPs = new List(); 
IPs.Add("10.1.1.12"); 
IPs.Add("10.1.1.15"); 
IPs.Add("OAOkomp1"); 
IPs.Add("192.168.173.160"); 
IPs.Add("www.google.com"); 
IPs.Add("www.amazon.com"); 
Ping Pinger = new Ping(); 
foreach (string ip in IPs) 
{ 
    PingReply Reply = Pinger.Send(ip); 
    Console.WriteLine("Ping " + ip + ": " + Reply.Status.ToString()); 
}

      С помощью всего нескольких строк кода, теперь вы можете определить состояние ваших компьютеров в вашей локальной сети или в интернете. Ping класс предоставляет несколько опций, которые можно использовать для управления запросами, а также возможность отправки асинхронных запросов.




Мониторинг буфера обмена

2012-10-15 09:02:37 (читать в оригинале)


Обзор
      ОС Windows поддерживает список, или цепь, приложений, которые обратились с просьбой получить уведомление, когда данные поступят в буфер обмена. Каждый раз, когда в буфере обмена изменяется данные, первое приложение в этой цепочке получает сообщение - WM_DRAWCLIPBOARD. Приложения могут запросить тип данных в буфере обмена, например RTF, ASCII текст, и так далее. Так как нет управляемых (. NET) API для добавления приложения в цепочку, чтобы получать уведомление об изменении буфера, вы должны использовать Win32 SetClipboardViewer. Вы должны знать некоторые общие правила при использовании этой функции.
      • При вызове SetClipboardViewer, вам необходимо пройти дескриптор окна, которое будет получать сообщение WM_DRAWCLIPBOARD. SetClipboardViewer функция возвращает текущее первое приложение в цепочке. Ваше приложение должно хранить в классе членов, потому что каждое приложение которое получает сообщение WM_DRAWCLIPBOARD может отправить то же сообщение к следующему приложению в цепочке (через функцию SendMessage).
      • WM_CHANGECBCHAIN. Поскольку каждое приложение, которое обрабатывает WM_DRAWCLIPBOARD, отвечает за отправку этого сообщения к следующему приложению в цепочке, оно также должно знать, когда изменилась цепь. Буфер обмена посылает сообщения WM_CHANGECBCHAIN , когда приложение удалило себя из цепочки.
      • При завершении работы необходимо удалить приложение из цепочки. Эта задача решается с помощью Win32ChangeClipboardChain функции, и это может быть сделано в любое время, буфер обмена мониторинга больше не нужен.

Для работы вам понадобится разместить компонент richTextBox. Так же в его свойствах ForeColor указать цвет Black!

Вот код приложения:

IntPtr nextClipboardViewer;

public Form1()
{
    InitializeComponent();
    nextClipboardViewer = (IntPtr)SetClipboardViewer((int)
                this.Handle);
}
[DllImport("User32.dll")]
  protected static extern int
            SetClipboardViewer(int hWndNewViewer);
[DllImport("User32.dll", CharSet=CharSet.Auto)]
public static extern bool
         ChangeClipboardChain(IntPtr hWndRemove,
                              IntPtr hWndNewNext);
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, 
                                     int wMsg,
                                     IntPtr wParam,
                                     IntPtr lParam);

protected override void WndProc(ref System.Windows.Forms.Message m)
{              
    const int WM_DRAWCLIPBOARD = 0x308;
    const int WM_CHANGECBCHAIN = 0x030D;

    switch (m.Msg)
    {
        case WM_DRAWCLIPBOARD:
            DisplayClipboardData();
            SendMessage(nextClipboardViewer, m.Msg, m.WParam,
                        m.LParam);
            break;

        case WM_CHANGECBCHAIN:
            if (m.WParam == nextClipboardViewer)
                nextClipboardViewer = m.LParam;
            else
                SendMessage(nextClipboardViewer, m.Msg, m.WParam,
                            m.LParam);
            break;

        default:
            base.WndProc(ref m);
            break;
    }
}

void DisplayClipboardData()
{
    try
    {
        IDataObject iData = new DataObject();
        iData = Clipboard.GetDataObject();

        if (iData.GetDataPresent(DataFormats.Rtf))
            richTextBox1.Rtf = (string)iData.GetData(DataFormats.Rtf);
        else if (iData.GetDataPresent(DataFormats.Text))
            richTextBox1.Text = (string)iData.GetData(DataFormats.Text);
        else
            richTextBox1.Text = "[Clipboard data is not RTF or ASCII Text]";
    }
    catch (Exception e)
    {
        MessageBox.Show(e.ToString());
    }
}
Так же вам необходимо в Form1.Designer.cs заменить функцию Dispose:
С:
protected override void Dispose(bool disposing)
{    
    if (disposing)
    {
        if (components != null)
        {
            components.Dispose();
        }
    }
    base.Dispose(disposing);
}
НА:
protected override void Dispose(bool disposing)
{
    ChangeClipboardChain(this.Handle, nextClipboardViewer);
    if (disposing)
    {
        if (components != null)
        {
            components.Dispose();
        }
    }
    base.Dispose(disposing);
}

Скриншот получившегося приложения:


Страницы: ... 21 22 23 24 25 26 27 28 29 30 31 32 33 

 


Самый-самый блог
Блогер ЖЖ все стерпит
ЖЖ все стерпит
по количеству голосов (152) в категории «Истории»


Загрузка...Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.