C# WPF сериализация XmlSerializer класс

Дата: 4 October, 2015, Автор: admin_kselax

Почитать за это класс XmlSerializer можно тут.

Я пробовал MainWindow сериализовать ничего не вышло. Есть видео по этой сериализации, я его внизу приведу, там для WinForm.

Приведу код та и все по файлам

>>>Читать далее

C# WPF Webbrowser примеры кода

Дата: 30 September, 2015, Автор: admin_kselax

В C# есть два WebBrowser, один в пространстве имен System.Windows.Controls.WebBrowser, а другой в System.Windows.Forms.WebBrowser.

Похоже первый браузер который есть в WPF а это System.Windows.Controls.WebBrowser он вроде по функционалу слабенький для парсеров и ботов, поэтому мы будем использовать webbrowser  System.Windows.Forms.WebBrowser.

всяко разно »

чтобы не выводились ошибки сценария JavsScript добавим

webBrowser.ScriptErrorsSuppressed = true;

1. Подключение WebBrowser к WPF

Показать »

И так для начала нам нужно подключить веббраузер. По умолчанию у нас подключен System.Windows.Controls.WebBrowser. Его использовать не составляет труда, но потому что он убогий по функционалу, мы будем использовать другой из WondowsForm. Для того чтобы использовать пространство имен System.Windows.Forms нужно в менеджере ссылок его подключить. Заходим в проект и добавляем ссылки System.Windows.Forms , а также нужно еще добавить ссылку WindowsFormsIntegration. Все мы можем использовать браузер.

Чтобы браузер было виндо нужно его встроить на страницу

<Window x:Class="Test_fl.ru.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test_fl.ru"
        xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        mc:Ignorable="d"
        
        Title="MainWindow" Height="489.577" Width="860.586">
    <Grid Margin="0,0,2,-21">
        <Button x:Name="button" Content="Start" HorizontalAlignment="Left" Margin="718,24,0,0" VerticalAlignment="Top" Width="75" Click="button_Click" IsDefault="True"/>
        <TextBox x:Name="url" HorizontalAlignment="Left" Height="23" Margin="38,24,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="600"/>
        
        <WindowsFormsHost Margin="38,24,189,57">
            <forms:WebBrowser x:Name="webBrowser"></forms:WebBrowser>
        </WindowsFormsHost>
    </Grid>
</Window>

этой строчкой мы указываем ссылку на формы

xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

а эти строчки встраивают браузер на страницу

<WindowsFormsHost Margin="38,24,189,57">
      <forms:WebBrowser x:Name="webBrowser"></forms:WebBrowser>
</WindowsFormsHost>

2. Прочитать текст из WebBrowser

Показать »

Просто так нельзя присвоить, потому что если сайт будет в cp1251 или другой кодировке отличной от utf8, то при записи в файл будут крякозябры

string text = webBrowser.DocumentText;

Нужно делать так через потоки

Stream stream = webBrowser.DocumentStream;
StreamReader sr = new StreamReader(stream, Encoding.Default);
string text = sr.ReadToEnd();
stream.Close();
textBox.Text = text;

3. Удалить cookie из webbrowser

Показать »

Подключаем wininet.dll

[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern bool InternetSetOption(
                                                    IntPtr hInternet,
                                                    int dwOption,
                                                    IntPtr lpBuffer,
                                                    int lpdwBufferLength);

не забываем добавить в самом начале файла

using System.Runtime.InteropServices;

И сам код

//logOut
        private void button_logout_Click(object sender, RoutedEventArgs e)
        {
            if(InternetSetOption(IntPtr.Zero, 42, IntPtr.Zero, 0))
            {
                System.Diagnostics.Process.Start("cmd.exe", "/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255");
            }
        }

Отключить вывод ошибко в webbrowser

Показать »

webBrowser.ScriptErrorsSuppressed = true;

Дождаться конца загрузки страницы DocumentCompleted

Показать »

//событие на загрузку страницы
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url.AbsolutePath != (sender as System.Windows.Forms.WebBrowser).Url.AbsolutePath)
        return;

    m_flag = false;
    m_timer.Stop();
}

webbrower шаблон для winforms

Показать »

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BotForSteam
{
    public partial class Form1 : Form
    {
        public System.Windows.Forms.Timer m_timer;//таймер
        public int m_count;
        public bool m_flag;

        public Form1()
        {
            InitializeComponent();
            //инициализация таймера
            m_timer = new System.Windows.Forms.Timer();//таймер
            m_timer.Tick += new EventHandler(f_timer);//подписка на событие
            m_timer.Interval = 1000;//1 секунда

            webBrowser.ScriptErrorsSuppressed = true;
            webBrowser.Navigate("http://google.ru");
        }

        private void button_Start_Click(object sender, EventArgs e)
        {
            MyNavigate("http://fl.ru");
        }

        private void button_Logout_Click(object sender, EventArgs e)
        {
            
        }

        //таймер
        private void f_timer(object sender, EventArgs e)
        {
            m_count--;
            textBox.AppendText(Convert.ToString(m_count, 10) + "n");
            if (m_count < 0)
            {
                m_flag = false;//выход из цикла
            }
        }

        //функция для загрузки страницы
        private void MyNavigate(string url)
        {
            m_flag = true;
            m_count = 10;//секунд
            m_timer.Start();//запуск таймера
            webBrowser.Navigate(url);
            while (m_flag)
            {
                System.Windows.Forms.Application.DoEvents();
                //задержка 0.1 сек
                System.Threading.Thread.Sleep(TimeSpan.FromSeconds(0.1));
            }
            m_timer.Stop();//остановка таймера
        }

        //событие на загрузку страницы
        private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url.AbsolutePath != (sender as System.Windows.Forms.WebBrowser).Url.AbsolutePath)
                return;

            m_flag = false;
            m_timer.Stop();
        }
    }
}

еще один

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;//для подключения длл

namespace BotForSteam
{
    public partial class Form1 : Form
    {
        public System.Windows.Forms.Timer m_timer;//таймер
        public int m_count;
        public bool m_flag;

        [DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern bool InternetSetOption(
                                                    IntPtr hInternet,
                                                    int dwOption,
                                                    IntPtr lpBuffer,
                                                    int lpdwBufferLength);

        public Form1()
        {
            InitializeComponent();
            //инициализация таймера
            m_timer = new System.Windows.Forms.Timer();//таймер
            m_timer.Tick += new EventHandler(f_timer);//подписка на событие
            m_timer.Interval = 1000;//1 секунда

            webBrowser.ScriptErrorsSuppressed = true;
            webBrowser.Navigate("http://google.ru");
        }

        private void button_Start_Click(object sender, EventArgs e)
        {
            MyNavigate("http://fl.ru");
        }

        private void button_Logout_Click(object sender, EventArgs e)
        {
            if (InternetSetOption(IntPtr.Zero, 42, IntPtr.Zero, 0))
            {
                System.Diagnostics.Process.Start("cmd.exe", "/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255");
            }
        }

        //таймер
        private void f_timer(object sender, EventArgs e)
        {
            m_count--;
            textBox.AppendText(Convert.ToString(m_count, 10) + "n");
            if (m_count < 0)
            {
                m_flag = false;//выход из цикла
                m_timer.Stop();//останавливаем таймер
            }
        }

        //функция для загрузки страницы
        private void MyNavigate(string url)
        {
            m_flag = true;
            m_count = 10;//секунд
            m_timer.Start();//запуск таймера
            webBrowser.Navigate(url);
            while (m_flag)
            {
                System.Windows.Forms.Application.DoEvents();
                //задержка 0.1 сек
                System.Threading.Thread.Sleep(TimeSpan.FromSeconds(0.1));
            }
            m_timer.Stop();//остановка таймера
        }

        //событие на загрузку страницы
        private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url.AbsolutePath != (sender as System.Windows.Forms.WebBrowser).Url.AbsolutePath)
                return;

            m_flag = false;//выход из цикла
            m_timer.Stop();//останавливаем таймер
        }

        private void button_Set_Click(object sender, EventArgs e)
        {

        }
    }
}

запись в файл текста из webbrowser в той кодировке в которой он есть

Показать »

// 2. проверяем была ли авторизация
Stream stream = webBrowser.DocumentStream;
StreamReader sr = new StreamReader(stream, Encoding.Default);
string text = sr.ReadToEnd();
stream.Close();
//textBox.Text = text;
//сохраняем в файл с кодировкой по умолчанию
File.WriteAllText("data.html", text, Encoding.Default);

 

 

 

 

 

Proxy Switcher на MFC скачать, исходник

Дата: 9 September, 2015, Автор: admin_kselax

Прокси свичер, программка для смены прокси. Полностью меняет прокси на компе, прописывает в реестре. (Ссылка на скачивание программки в самом низу)

Proxy Switcher

Можно устанавливать как один прокси, так можно и добавить список в файле и перебирать.

Добавляем один прокси

>>>Читать далее

Phantomjs консольный веббраузер для новичков.

Дата: 4 September, 2015, Автор: admin_kselax

Phantomjs – это консольный веб – браузер без экрана headless. Его мы будем использовать для создания ботов и парсеров сайтов с javascript кодом, где данные подгружаются черзе javascript просто спарсить через curl не получиться.

Создание файла который будет загружать JS

Официальный сайт Phantomjs PhantomJS

И так это консольный браузер. Я с гаряча его как бы хотел попробовать на нем писать парсер вместо Curl и WinInet но как то так посмотрел, там все коды нужно делать на JavaScript, поэтому в общем как то не ясно как его оформлять. Короче была идея создать через CreateProcess процесс, создать пайп, перенаправить stdin и stdout и посылать код js на обработку и получать результат. Фиг его знает как он будет работать, да и реализовать это не так просто будет. Наверно все таки WebBrowser лучше будет использовать. Есть еще второй вариант как использовать, это просто запускать JavaScript скрипты и ждать пока они спарсять, но тогда смысл использовать MFC и С++, только ради GUI наверно и возможно как клей. Вообще в этом Phantomjs нужно разбираться, например как он куки сохраняет, а если я выйду из phantomjs и что куки которые были ранее пропадут? >>>Читать далее

Собственные функции MFC

Дата: 31 August, 2015, Автор: admin_kselax

Функция создает процесс CreateProcess и перенаправляет вывод

Показать »

//фукнкция создает процесс с помощью CreateProcess и читает из него данные
//для консольного приложения
CString MyCreateProcess(CString name, CString param)
{
	char buf[1024];           //буфер ввода/вывода



	STARTUPINFO si;
	SECURITY_ATTRIBUTES sa;
	PROCESS_INFORMATION pi;

	HANDLE newstdout,read_stdout;  //дескрипторы
                                                      // пайпов

	sa.lpSecurityDescriptor = NULL;

	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.bInheritHandle = true;       //разрешаем наследование дескрипторов

	if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //создаем пайп
													// для stdout
	{
		AfxMessageBox(L"CreatePipe");
		return L"";
	}


	GetStartupInfo(&si);      //создаем startupinfo для
                            // дочернего процесса

	/*

	Параметр dwFlags сообщает функции CreateProcess
	как именно надо создать процесс.

	STARTF_USESTDHANDLES управляет полями hStd*.
	STARTF_USESHOWWINDOW управляет полем wShowWindow.

	*/

	si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_HIDE;
	si.hStdOutput = newstdout;
	si.hStdError = newstdout;   //подменяем дескрипторы для

	// char app_spawn[] = L"d:\winnt\system32\cmd.exe"; //это просто
														// пример,
														//замените на то,
														// что вам нужно


  
//	TCHAR szCmdline[]=L"recognition.exe img.png";
//	CString str(L"recognition.exe img.png");
	//создаем дочерний процесс
	if (!CreateProcess(name.GetBuffer(),param.GetBuffer(),NULL,NULL,TRUE,HIGH_PRIORITY_CLASS,
						NULL,NULL,&si,&pi))
	{
		AfxMessageBox(L"CreateProcess");
		CloseHandle(newstdout);
		CloseHandle(read_stdout);
		return L"";
	}



	unsigned long exit=0;  //код завершения процесса
	unsigned long bread;   //кол-во прочитанных байт
	unsigned long avail;   //кол-во доступных байт
	CString result(L"");//результат



	std::fill(buf,buf+1024,0);

	for(;;)      //основной цикл программы
	{
		GetExitCodeProcess(pi.hProcess,&exit); //пока дочерний процесс
                                           // не закрыт
		if (exit != STILL_ACTIVE)
			break;

		PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);

		//Проверяем, есть ли данные для чтения в stdout

		if (bread != 0)
		{
			std::fill(buf,buf+1024,0);
			if (avail > 1023)
			{
				while (bread >= 1023)
				{
					ReadFile(read_stdout,buf,1023,&bread,NULL);  //читаем из
																// пайпа stdout
					CString str;str.Format(L"%S",buf);
				//	AfxMessageBox(str);
					result+=str;
					std::fill(buf,buf+1024,0);
				}
			}
			else
			{
				ReadFile(read_stdout,buf,1023,&bread,NULL);
				CString str;str.Format(L"%S",buf);
			//	AfxMessageBox(str);
				result+=str;
			}
		}
	}

	CloseHandle(pi.hThread);
	CloseHandle(pi.hProcess);           //небольшая уборка за собой
	CloseHandle(newstdout);
	CloseHandle(read_stdout);

	return result;
}

WebBrowser, функция копирует изображение в буфер из браузера

Показать »

//Функция добавляет изображение в буфер
//принимает
// 1. CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2>& pDoc2
// 2. CComQIPtr<IHTMLElement,&IID_IHTMLElement> pImgElement;
BOOL AddImgToBuffer(CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2>&pDoc2, CComQIPtr<IHTMLElement,&IID_IHTMLElement>& pImgElement)
{
	IHTMLElement* pelmBody=NULL;//тело документа
	IHTMLElement2* pelmBodyTwo=NULL;//тело документа 2
	IDispatch* pdispCtrlRange=NULL;
	IDispatch* pdispImgElement=NULL;
	IHTMLControlRange* pCtrlRange=NULL;
	IHTMLControlElement* pCtrlElement = NULL;

	// 1. получаем IHTMLElement* pelmBody = NULL;
	if(FAILED(pDoc2->get_body(&pelmBody)) || pelmBody == NULL)
	{AfxMessageBox(L"net pelmBody");return FALSE;}
	// 2. получаем IHTMLElement2* pelmBodyTwo = NULL;
	if (FAILED(pelmBody->QueryInterface(IID_IHTMLElement2, (void**) &pelmBodyTwo)) || pelmBodyTwo == NULL)
	{AfxMessageBox(L"net pelmBodyTwo");return FALSE;}
	// 3. получаем IDispatch* pdispCtrlRange = NULL;
	if (FAILED(pelmBodyTwo->createControlRange(&pdispCtrlRange)) || pdispCtrlRange == NULL) 
	{AfxMessageBox(L"net pelmBodyTwo");return FALSE;}
	// 4. получаем IHTMLControlRange* pCtrlRange = NULL;
	if (FAILED(pdispCtrlRange->QueryInterface(IID_IHTMLControlRange, (void**) &pCtrlRange)) || pCtrlRange == NULL)
	{AfxMessageBox(L"net pCtrlRange");return FALSE;}
	// 5. получаем IHTMLControlElement* pCtrlElement = NULL;
	if (FAILED(pImgElement->QueryInterface(IID_IHTMLControlElement, (void**) &pCtrlElement)) || pCtrlElement == NULL) 
	{AfxMessageBox(L"net pCtrlElement");return FALSE;}
	// 6. добавляем элементв Control
	if(FAILED(pCtrlRange->add(pCtrlElement))){AfxMessageBox(L"not pCtrlRange->add(pCtrlElement)");}
	// 7. выполняем команду (походу коппирует в буфер изображение в браузере)
	VARIANT_BOOL vbReturn;
	VARIANT vEmpty;
	VariantInit(&vEmpty);
	if(FAILED( pCtrlRange->execCommand(L"Copy", VARIANT_FALSE,vEmpty, &vbReturn) ))
	{AfxMessageBox(L"not execCommand");return FALSE;}

	return TRUE;
}

Преобразование из CStringW в char*

Показать »

Почитать за преобразования различных типов можно тут. Функция которая преобразует CStringW в char*

//преобразовывает CStringW в Char
char* CStringW_to_char(CStringW str)
{
    const size_t newsizew = (str.GetLength() + 1)*2;
    char *nstringw = new char[newsizew];
    size_t convertedCharsw = 0;
    wcstombs_s(&convertedCharsw, nstringw, newsizew, str, _TRUNCATE );
    return nstringw;
}

 

 

Parser_fl_ru программка для автоматических ответов под проектами :)

Дата: 26 August, 2015, Автор: admin_kselax

Программка для автоматического отсылания сообщения под проектами на сайте fl.ru

Запускаем программуку

Pars_fl_ruв настройках вводим логин пароль и сообщение которое хотите оставить, так же вводим время задержки между запросами, чем больше чем меньше шансов что забанят, вводим с какой страницы начинаем и количество страниц в постраничной >>>Читать далее

MFC Сериализация диалогового приложения Serialize

Дата: 22 August, 2015, Автор: admin_kselax

Здорова!

Сегодня разберем как создать сериализацию для диалогового приложения. И так приступим. Создаем диалоговое приложение, в классе диалога перезагружаем функцию Serialize и добавляем в нее код

Ctest_fl_ruDlg::Serialize »

void Ctest_fl_ruDlg::Serialize(CArchive& ar)
{
	AfxMessageBox(L"Serialize");
	TRACE("Serializen");
	CDialogEx::Serialize(ar);//вызываем функцию предка
	if (ar.IsStoring())
	{	// storing code
		ar <<m_cLogin<<m_cPass;
	}
	else
	{	// loading code
		TRACE("Loading coden");
		ar >>m_cLogin>>m_cPass;
	}
}
Нужно вроде обязательно вызвать функцию для базового класса CDialogEx::Serialize

Дальше нужно добавить в определение класса макрос

DECLARE_SERIAL(Ctest_fl_ruDlg)

и в файл с определениями функций класса

IMPLEMENT_SERIAL(Ctest_fl_ruDlg,CDialogEx,1)

Если мы сейчас скомпилируем приложение то функция сериализации вызываться не будет, нам нужно добавить в конструктор ее вызов и в деструктор класса. Ну я так сделал. Вот код конструктора >>>Читать далее

MFC DECLARE_EVENTSINK_MAP отлов событий в WebBrowser

Дата: 19 August, 2015, Автор: admin_kselax

Здорова! Сегодня разберем такой макрос как DECLARE_EVENTSINK_MAP. В WebBrowser существуют события DWebBrowserEvents2, почитать за этот интерфейс можно тут.  За DECLARE_EVENTSINK_MAP читаем тут.

Приступим к реализации отлова событий. Создаем приложение MFC на основе диалоговых окон, подключаем и WebBrowser, вообще директиву #import можно не использовать, WebBrowser походу уже подключен по умлочанию имеются интерфейсы, потому что когда мы подключаем с помощью #import у нас происходит конфликт имен и нужно обязательно определять пространство имен для #import. Нам нужно только подключать файл для работы с DOM файл mshtml.h . В общем добавили WebBrowser и у вас получилось такое окошко

WebBrowserЭто я загрузил страницу microsoft.com по нажатию на кнопку “start”, вот код обработчика кнопки старт >>>Читать далее

MFC Программирование многопоточного приложения

Дата: , Автор: admin_kselax

Здорова! Сегодня разберем как создаются многопоточные приложения. Про то как создаются однопоточные приложения мы уже разобрали тут.

Немножко теории и терминов

Процесс (process) – это выполняемая программа, обладающая собственной памятью, описателями файлов и другими системными ресурсами. Процесс может допускать несколько параллельных путей исполнения кода, называемых потоками (threads).

Потоки в Windows бывают двух видов: рабочие потоки (worder threads) и потоки пользовательского интерфейса (user-interface threads). MFC – библиотека поддерживает оба вида. У потоков пользовательского интерфейса есть она, а значит и свой цикл выборки сообщений, а у рабочего нет. Рабочие потоки легче программировать и они как правило полезнее.

Не забывайте что даже в однопоточном приложении есть поток, который называется основным потоком (main thread).
>>>Читать далее

MFC Обработка сообщений Windows в однопоточной программе

Дата: , Автор: admin_kselax

Здорова! Немножко разберемся как обрабатывает сообщения Windows в однопоточной программе и создадим эту программку тестовую. В каждой программе виндовс спрятаны следующие инструкции

while(::GetMessage(&message,NULL,0,0))
{
	::TranslateMessage(&message);
	::DispatchMessage(&message);
}

Это бесконечный цикл из которого никогда не будет выхода, потому что если нету сообщений функция GetMessage ждет пока они появятся, про нее вы можете почитать тут. Windows определяет, какие сообщения принадлежат вашей программе, а функция GetMessage возвращает управление, как только появляется сообщение для обработки. Если сообщений нет, то программа приостанавливается, и выполняются другие приложения. Когда сообщения поступают, то ваша программа “пробуждается”. >>>Читать далее