|
Какой рейтинг вас больше интересует?
|
Главная /
Каталог блоговCтраница блогера Справочник по C#/Записи в блоге |
![]() |
|
Запрет на изменение раскладки клавиатуры в вашем 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 (читать в оригинале)

На сегодняшний день мне известны два способа парсинга:
с помощью регулярных выражений;
с помощью 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]/tableFirefox:
/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. Вот так у него выглядит форма регистрации:




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.ruprivate 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 пространства имен 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);
}
Скриншот получившегося приложения:

Категория «Музыканты»
Взлеты Топ 5
|
| ||
|
+187 |
221 |
Yurenzo |
|
+178 |
226 |
FLL |
|
+170 |
187 |
rled |
|
+149 |
196 |
Elgrad.info - живой город - Соберемся вместе! |
|
+147 |
182 |
Vlad_Topalov |
Падения Топ 5
|
| ||
|
-3 |
15 |
Nique |
|
-6 |
2 |
Евгений Гришковец |
|
-9 |
13 |
Мартышка_с_Алмазами |
|
-10 |
45 |
Детские советские композиторы |
|
-15 |
77 |
Indie Birdie Blog |
Популярные за сутки
Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.
взяты из открытых общедоступных источников и являются собственностью их авторов.

