Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/23: Рейтинг темы: голосов - 23, средняя оценка - 4.87
Геныч
Заблокирован
1

Коллекция полезных исходников, трюков и хаков C++/CLI

25.07.2014, 18:22. Просмотров 4276. Ответов 5
Метки нет (Все метки)

Управление файлами, папками, дисками. System::IO. Основные приемы

Классы для управления файлами, папками и дисками (применяемые, например, для создания, удаления,
копирования папок и файлов, чтения и записи файлов) в основном сосредоточены в пространстве имён
System::IO
Его нам придется включить в файл исходного кода своего приложения:
C++
1
2
using namespace System;
using namespace System::IO;
Файлы

Читаем и пишем текстовый файл


Читаем
C++
1
2
3
4
StreamReader ^sr = gcnew StreamReader("D:\\Demo.txt");
MessageBox::Show(sr->ReadToEnd());
sr->Close();
delete sr;
Пишем
C++
1
2
3
4
5
6
StreamWriter ^sw = gcnew StreamWriter("D:\\Demo.txt");
sw->WriteLine("Рыба");
sw->Write("Рыбка...");
sw->Write("Рыбина\nРыбешка");
sw->Close();
delete sw;
Внимание! Сохранять файлы в корень C: на Vista, 7, 8 можно только при запуске от имени админа!!!

Читаем (альтернатива)
C++
1
MessageBox::Show(File::ReadAllText("D:\\Demo.txt"));
Пишем (альтернатива)
C++
1
File::WriteAllText("D:\\Demo.txt", "Рыба");


Копируем файл


C++
1
File::Copy("D:\\Откуда.txt", "E:\\Куда.txt", true);
C++
1
File::Copy("D:\\Откуда.txt", "E:\\Куда.txt"); // Не копировать если такой файл уже есть


Удаляем файл


C++
1
File::Delete("D:\\Кого_удалять_будем.txt");


Проверяем, есть ли файл


C++
1
2
3
4
5
if (File::Exists("D:\\Кто_там_есть.txt")) {
    MessageBox::Show("Есть");
} else {
    MessageBox::Show("Нет");
}


Закрываем файл для чтения и/или изменения (не должно работать в WinXP и старше)


Включим пространство имён System::Security::AccessControl
C++
1
2
3
using namespace System;
using namespace System::IO;
using namespace System::Security::AccessControl;
Закрываем файл для чтения
C++
1
2
3
4
5
FileInfo ^fi = gcnew FileInfo("D:\\Порно.jpg");
FileSecurity ^ac = fi->GetAccessControl();
FileSystemRule ^fsr = gcnew FileSystemAccessRule("Все", FileSystemRights::Read, AccessControlType::Deny);
ac->AddAccessRule(fsr);
fi->SetAccessControl(ac);
Закрываем файл для записи
C++
1
2
3
4
5
FileInfo ^fi = gcnew FileInfo("D:\\Домашнее_задание_на_лето.rtf");
FileSecurity ^ac = fi->GetAccessControl();
FileSystemRule ^fsr = gcnew FileSystemAccessRule("Все", FileSystemRights::Write, AccessControlType::Deny);
ac->AddAccessRule(fsr);
fi->SetAccessControl(ac);
Внимание
Для разблокировки: правая кнопка мыши на файле ==> Свойства ==> Безопасность ==> Дополнительно ==> Элементы разрешения, где удаляем запрет
На английских версиях ОС вместо "Все" надо подставить что-то другое. Напр., на английских -- "Everyone"



Прячем файл (добавляем атрибут "Скрытый")


C++
1
2
3
4
String^ szFileName = "D:\\Файл.dat";
FileAttributes fa = File::GetAttributes(szFileName);
fa = fa | FileAttributes::Hidden;
File::SetAttributes(szFileName, fa);


Показываем файл


C++
1
2
3
4
String^ szFileName = "D:\\Файл.dat";
FileAttributes fa = File::GetAttributes(szFileName);
fa = fa & ~FileAttributes::Hidden;
File::SetAttributes(szFileName, fa);


Папки

Создаем папку


C++
1
Directory::CreateDirectory("D:\\Папка");


Перемещаем папку


C++
1
Directory::Move("D:\\Откуда", "D:\\Куда");


Удаляем папку


C++
1
Directory::Delete("D:\\Приговоренная_к_смерти", true);
Для пустой папки:
C++
1
Directory::Delete("D:\\Приговоренная_к_смерти");


Проверяем есть ли папка


C++
1
2
3
4
5
if (Directory::Exists("D:\\Кто_там_есть")) {
    MessageBox::Show("Есть");
} else {
    MessageBox::Show("Нет");
}


Диски

Узнаем буквы, метки (имена) и объем свободного места на всех дисках


C++
1
2
3
4
5
6
7
8
9
10
array<DriveInfo^>^ drives = DriveInfo::GetDrives();
for each (DriveInfo^ d in drives) {
    MessageBox::Show("Имя диска: " + d->Name);
    if (d->IsReady) {
        MessageBox::Show("Метка диска: " + d->VolumeLabel);
    MessageBox::Show("Свободное место на диске: " + d->AvailableFreeSpace + " байт");
    } else {
    MessageBox::Show("Диск " + d->Name + " недоступен");
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2014, 18:22
Ответы с готовыми решениями:

Коллекция исходников языка Visual Basic
Прошу писать все сайты исходников языка Visual Basic . Как наши так и...

Есть ли где коллекция исходников простеньких программ ?
Ковыряюсь с изучением VS 2010 С++ и хотелось бы примеры всякие типа...

Коллекция исходников по алгоритмам и ссылок по работе с интерфейсами в МК
...как мы все понимаем: учиться лучше на чужих ошибках и примерах. Именно...

Как избавиться от хаков (костылей) и индусского кода?
Здравствуйте используя Swing пишу табличную GUI программку для работы с базой...

Ребята, кому не сложно, напишите свои сборки хаков и маков
Ребята, кому не сложно, напишите свои сборки хаков и маков, а также конфиги...

5
Геныч
Заблокирован
26.07.2014, 13:26  [ТС] 2
Запуск программ, файлов. Открытие ссылок в браузере. Работа с процессами других программ

Сперва заюзайте пространство имен
C++
1
System::Diagnostics
Оно применяется во всех нижеприведенных кодах.

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

Как запустить программу

C++
1
2
3
Process::Start("C:\\Windows\\system32\\notepad.exe");
//если программа лежит рядом с exe нашей программы:
//Process::Start(Application::StartupPath + "\\proga.exe");


Как запустить программу в тихом режиме (без открытия главного окна)

C++
1
2
3
4
ProcessStartInfo ^psi = gcnew ProcessStartInfo();
psi->FileName = "C:\\Windows\\system32\\notepad.exe";
psi->WindowStyle = ProcessWindowStyle::Hidden;
Process::Start(psi);


Как запустить программу, чтобы ее окно было развернуто во весь экран/свернуто в значок

C++
1
2
3
4
ProcessStartInfo ^psi = gcnew ProcessStartInfo();
psi->FileName = "C:\\Windows\\system32\\notepad.exe";
psi->WindowStyle = ProcessWindowStyle::Maximized; //::Minimized
Process::Start(psi);


Как запустить программу, дождаться ее закрытия и выполнить некий код

C++
1
2
3
Process ^p = Process::Start("C:\\Windows\\system32\\notepad.exe");
p->WaitForExit();
MessageBox::Show("Программа закрыта!!!");


Как запустить консольное приложение и получить тот текст, который будет выведен в консоль

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Process ^p = gcnew Process();
p->OutputDataReceived += gcnew DataReceivedEventHandler(this, &Form1::OutputDataReceived);
p->StartInfo->FileName = "C:\\Windows\\system32\\cmd.exe";
p->StartInfo->UseShellExecute = false;
p->StartInfo->RedirectStandardOutput = true;
p->Start();
p->BeginOutputReadLine();
 
private: System::Void OutputDataReceived(System::Object^ sender, DataReceivedEventArgs ^e) {
    try {
        MessageBox::Show(e->Data);
    } catch (Exception ^ex) { }
}
Обратите внимание: в консоли при этом текст перестает отображается.


Открытие файлов в программах и ссылок в браузерах

Открытие файла в программе по умолчанию

C++
1
Process::Start("D:\\Задание.txt");


Открытие файла в заданной программе

C++
1
Process::Start("C:\\Windows\\notepad.exe", "D:\\Задание.txt");


Открытие ссылки в браузере по умолчанию

C++
1
Process::Start("http://www.cyberforum.ru");


Работа с процессами других программ


Получение доступа к процессам программы по имени:

C++
1
2
array<Process^>^ np = Process::GetProcessesByName("notepad");
np[0]->...
Примечание: GetProcessName возвращает массив всех процессов с данным именем, которых, очевидно,
может быть более 1.


Закрытие процесса (принудительное и моментальное)

C++
1
2
array<Process^>^ np = Process::GetProcessesByName("notepad");
np[0]->Kill();


Запрос на закрытие к главному окну процесса (процесс может отменить закрытие, например выдав
окно типа "Сохранить изменения?" и т.д.)

C++
1
2
array<Process^>^ np = Process::GetProcessesByName("notepad");
np[0]->CloseMainWindow();


Получение заголовка основного окна процесса

C++
1
2
array<Process^>^ np = Process::GetProcessesByName("notepad");
MessageBox::Show(np[0]->MainWindowTitle);


Управление основным окном процесса (получение hWnd и далее через WinAPI)

C++
1
2
3
4
5
6
7
#pragma once // в самый верх кода
#include <Windows.h>
#pragma comment(lib, "user32.lib")
...
array<Process^>^ np = Process::GetProcessesByName("notepad");
HWND hWnd = static_cast<HWND>(np[0]->MainWindowHandle.ToPointer());
SendMessageW(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);


Проверка, не зависла ли программа

C++
1
2
array<Process^>^ np = Process::GetProcessesByName("notepad");
MessageBox::Show(Convert::ToString(np[0]->Responding));


Примечание: также работает все то, что работает для процесса, запущенного самой программой, например, WaitForExit()
3
Геныч
Заблокирован
26.07.2014, 13:54  [ТС] 3
Рисование двухмерной графики на форме и элементах. System::Drawing

Создание изображения

2D-изображение можно загрузить из файла или создать программно. В любом случае, изображение хранится в ОЗУ в классе Bitmap - разновидности (производном от) класса Image.

Создание Bitmap 200x300 пикселей программно

C++
1
Bitmap ^bmp = gcnew Bitmap(200, 300);


Загрузка Bitmap из файла .bmp

C++
1
Bitmap ^bmp = Bitmap::FromFile("D:\\bitmap.bmp");


Загрузка Image из файла .gif

C++
1
Image ^img = Image::FromFile("D:\\gifka.gif");


Рисование на изображении

Bitmap содержит методы GetPixel(), получающий цвета отдельных пикселей рисунка, и SetPixel(), задающий цвета отдельным пикселям (в этом его и преимущество над Image).
Однако средств для продуктивного рисования сложных фигур ни в Bitmap, ни в Image не включено (вероятно, для экономии ОЗУ, чтобы не отводить на них ОЗУ, если они и не нужны, как-то в просмотровщиках картинок без редактирования).

Для рисования создают объект специального класса Graphics, прикрепленный к Image/Bitmap; посредством Graphics рисуют на изображении графику, а затем уничтожают объект Graphics оператором delete, чтобы не занимал зря ОЗУ. Отрисованная графика остается на Image/Bitmap.

Рисование линии на Image/Bitmap

C++
1
2
3
Graphics ^g = Graphics::FromImage(img); //::FromImage(bmp);
g->DrawLine(Pens::Black, 0, 0, 100, 100);
delete g;


Вывод изображения на форму

Image/Bitmap можно загрузить в специальный элемент PictureBox через свойство Image. Тогда он будет постоянно рисоваться на этом элементе, в том числе, будут запоминаться изменения, внесенные в дальнейшем через создание очередного Graphics.

Рисование на Image/Bitmap и вывод его в PictureBox

C++
1
2
3
4
5
Bitmap ^bmp = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);
Graphics ^g = Graphics::FromImage(bmp);
g->DrawLine(Pens::Black, 0, 0, 100, 100);
delete g;
pictureBox1->Image = bmp;

Обратите внимание, удалять bmp через delete здесь ненужно и нельзя. В pictureBox1 загружается тот самый bmp, а не создается на его базе еще один.

Инициализация Image из PictureBox и рисование непосредственно на нем

C++
1
2
3
4
pictureBox1->Image = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);
Graphics ^g = Graphics::FromImage(pictureBox1->Image);
g->DrawLine(Pens::Black, 0, 0, 100, 100);
delete g;


Рисование непосредственно на форме или контроле, без Image/Bitmap.


Это рисование в событии Paint. Данный способ применим не только к PictureBox, но и ко многим другим контролам и самой форме.
Image при этом НЕ инициализируется.
Если вы собрались, скажем, сохранять отрисованную таким образом графику в файл, то нужно предварительно проинициализировать Image (см. код выше). Графика будет рисоваться на нем.

Пример кода в Paint

C++
1
2
Graphics ^g = e->Graphics;
g->DrawLine(Pens::Black, 0, 0, 100, 100);


Paint для контролов вызывается при запуске формы.
Изображение на контроле/форме пропадает, когда форма оказывается свернута или перекрыта другой формой, но Paint тут же вызывается снова.
Удалять Graphics методом delete здесь не нужно и нельзя.

Допустим, мы решили нарисовать в PictureBox линию, которая будет составлять диагональ прямоугольника PictureBox, и масштабироваться при растягивании PictureBox вместе с формой.
Прописали в Paint такой код
e->Graphics->DrawLine(Pens::Black, 0, 0, pictureBox1->Width, pictureBox1->Height);
Однако мы видим, что при растягивании остаются куски "старой" диагонали!
Дело в том, что при Paint новая картинка рисуется поверх предыдущей.
Чтобы этого не было и картинка рисовалась заново, можно принудительно перерисовывать PictureBox в событии SizeChanged.

Принудительная перерисовка контрола + Paint

C++
1
pictureBox1->Invalidate();


Немного подробнее о Graphics, что в нем еще можно рисовать, кроме линий, как можно его настроить

В принципе, все это есть в MSDN, да и самому посмотреть не проблема (если IntelliSense не отключили за неуплату, как в Visual Studio 2010), но на всякий случай приведу примеров.

Рисование контура прямоугольника

C++
1
g->DrawRectangle(Pens::Blue, 4, 5, 100, 200);


Рисование закрашенного прямоугольника

C++
1
g->FillRectangle(Brushes::Black, 5, 10, 100, 200);


Рисование прямоугольника с толстым контуром нестандартного цвета (создание своего карандаша Pen вместо стандартного из Pens::)

C++
1
2
Pen ^pen = gcnew Pen(Color::FromArgb(255, 240, 240, 0), 5);
g->DrawRectangle(pen, 5, 10, 100, 200);


Рисование закрашенного прямоугольника нестандартного цвета (создание своей кисти Brush вместо стандартной из Brushes::)

C++
1
2
SolidBrush ^brush = gcnew SolidBrush(Color::FromArgb(255, 240, 240, 0));
g->FillRectangle(brush, 5, 10, 100, 200);


Использование полупрозрачных цветов

Сравните
C++
1
Color::FromArgb(126, 240, 240, 0)
и
C++
1
Color::FromArgb(255, 240, 240, 0)


Рисование текста

C++
1
g->DrawString("Ура", gcnew Drawing::Font("Arial", 16), Brushes::Black, 5, 10);


Включение сглаживания линий

C++
1
2
3
using namespace System::Drawing::Drawing2D;
...
g->SmoothingMode = SmoothingMode::HighQuality;
Попробуйте затем нарисовать диагональную линию и сравните.


Сохранение Image/Bitmap в файл

Помимо BMP, Вы можете сохранить свое изображение в PNG, JPEG, TIFF, ICO, GIF, WMF, EMF, EXIF.

GIF

C++
1
pictureBox1->Image->Save("D:\\gifka.gif", Imaging::ImageFormat::Gif);


При сохранении изображения в JPEG можно еще настроить его качество и соответственно уровень сжатия.
Попробуйте сделать это сами, воспользовавшись кодом на C# и переведя его на C++/CLI
http://msdn.microsoft.com/ru-ru/libr...code-snippet-1
1
Геныч
Заблокирован
26.07.2014, 14:58  [ТС] 4
Работа с реестром. Microsoft::Win32::Registry

В проект необходимо включить:
  • пространство имен Microsoft::Win32 через using namespace

Терминологическая справка

Параметр в реестре - это именованная ячейка, в которую можно записать определенное значение определенного типа (строка, число и др.), своего рода, файл.
Ключ (раздел) в реестре - это своего рода папка, в которой могут лежать подпапки и/или файлы - параметры.

Работа с ключами

Создание ключа

C++
1
2
RegistryKey ^key = Registry::CurrentUser->CreateSubKey("Software\\Ключ1\\Ключ2");
key->Close();
Обратите внимание: ключа "Ключ1", в котором будет лежать "Ключ2", в реестре еще нет. Он создается автоматически при создании вложенного в него "Ключ2".
И даже если почему-то не окажется ключа Software, он тоже будет создан автоматически.

А вот внутри ключа HKEY_LOCAL_MACHINE (Registry::LocalMachine), на Windows Vista и выше, у Вас не получится создать ничего. Там такую программу надо запускать от имени администратора.



Получение всех подключей в ключе

C++
1
2
3
4
5
6
7
8
RegistryKey ^key = Registry::CurrentUser->OpenSubKey("Software");
array<String^>^ subkeys = key->GetSubKeyNames();
for each (String^ s in subkeys) {
    if (MessageBox::Show(s, "", MessageBoxButtons::OKCancel) == Windows::Forms::DialogResult::Cancel) {
        break;
    }
}
key->Close();
Примечание: Registry::CurrentUser - это тоже RegistryKey. Для него тоже работает GetSubKeyNames(). Попробуйте и убедитесь сами.



Удаление ключа без подключей

C++
1
Registry::CurrentUser->DeleteSubKey("Software\\Ключ1\\Ключ2", false);
Примечания:
1. Обратите внимание, удаляется "Ключ2", но не "Ключ1".
Удалить "Ключ1" вместе с "Ключ2" этим способом не получится! Используйте способ ниже.
2. Если вторым параметром передается false, то в случае отсутствия удаляемого параметра не нужно выдавать исключение. По умолчанию этот параметр стоит в true!



Удаление ключа вместе с подключами

C++
1
Registry::CurrentUser->DeleteSubKeyTree("Software\\Ключ1");


Работа с параметрами

Создание параметра / запись в параметр

C++
1
2
3
4
5
RegistryKey ^key = Registry::CurrentUser->CreateSubKey("Software\\Ключ1\\Ключ2");
key->SetValue("Булев параметр", true);
key->SetValue("Строковый параметр", "Значение");
key->SetValue("DWORD-параметр", 256, RegistryValueKind::DWord);
key->Close();
Примечание: если параметр уже существует, он будет перезаписан.



Получение значения параметра

C++
1
2
3
RegistryKey ^key = Registry::CurrentUser->CreateSubKey("Software\\Ключ1\\Ключ2");
MessageBox::Show(key->GetValue("Строковый параметр", "Параметр не найден")->ToString());
key->Close();
Примечание: второй аргумент, "Параметр не найден", - это значение, которое будет возвращено GetValue(), если требуемого параметра в реестре не окажется.



Получение всех значений в ключе

C++
1
2
3
4
5
6
7
8
RegistryKey ^key = Registry::CurrentUser->CreateSubKey("Software\\Ключ1\\Ключ2");
array<String^>^ subkeys = key->GetValueNames();
for each (String^ s in subkeys) {
    if (MessageBox::Show(s, "", MessageBoxButtons::OKCancel) == Windows::Forms::DialogResult::Cancel) {
        break;
    }
}
key->Close();


Работа с некоторыми системными настройками в реестре

Добавление программы в автозагрузку Run

C++
1
2
3
RegistryKey ^key = Registry::CurrentUser->CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
key->SetValue("My Program", "c:\\proga.exe");
key->Close();


Добавление программы в "одноразовую" автозагрузку RunOnce

Параметр из этого ключа автоматически удаляется при первом же автозапуске программы.
C++
1
2
3
RegistryKey ^key = Registry::CurrentUser->CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce");
key->SetValue("My Program", "c:\\proga.exe");
key->Close();


Еще один список автозагрузки - Explorer\StartupApproved\Run

C++
1
2
3
RegistryKey ^key = Registry::CurrentUser->CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartupApproved\\Run");
key->SetValue("My Program", "c:\\proga.exe");
key->Close();


Добавление программы в список установленных программ (отображается в компоненте панели управления "Установка и удаление программ" / "Программы и компоненты")

C++
1
2
3
4
5
6
7
RegistryKey ^softlist = Registry::CurrentUser->CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
RegistryKey ^myapp = softlist->CreateSubKey("Моя программа");
myapp->SetValue("DisplayName", "Моя программа");
myapp->SetValue("Publisher", "Я");
myapp->SetValue("UninstallString", ""C:\\Program Files\\Моя программа\\uninstall.exe"");
myapp->Close();
softlist->Close();


Ассоциация файлов заданного расширения с программой (чтобы при открытии в проводнике открывались через эту программу)

Внимание! На WinVista и выше запускать от имени администратора! ПКМ на ехе -> Запуск от имени администратора.
C++
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
#pragma once
 
#include <Shlobj.h>
 
#pragma comment(lib, "Shell32.lib")
 
//...
 
RegistryKey ^keyExt = Registry::ClassesRoot->CreateSubKey(".myfileext");
keyExt->SetValue("", "mytestfile");
keyExt->Close();
 
RegistryKey ^keyOpt = Registry::ClassesRoot->CreateSubKey("mytestfile");
keyOpt->SetValue("", "Файл моего личного формата");
//
RegistryKey ^keyOpen = keyOpt->CreateSubKey("Shell")->CreateSubKey("open")->CreateSubKey("command");
keyOpen->SetValue("", "D:\\Моя прога.exe %1");
keyOpen->Close();
//
keyOpt->Close();
 
// удаление опции пользовательского выбора программы для открытия файла, если она есть
RegistryKey ^keyUc = Registry::CurrentUser->OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.myfileext", true);
keyUc->DeleteSubKey("UserChoice", false);
keyUc->Close();
 
// применение параметров к проводнику
SHChangeNotify(0x08000000, 0x0000, 0, 0);


Настройка обоев (фона) рабочего стола

C++
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
// ----------------- в самый верх кода после #pragma once -----------------
#include <Windows.h>
 
#pragma comment(lib, "User32.lib");
// ------------------------------------------------------------------------
RegistryKey ^key = Registry::CurrentUser->CreateSubKey("Control Panel\\Desktop");
 
key->SetValue("Wallpaper", "C:\\Обои.png");
 
// заполнение
//key->SetValue("TileWallpaper", "0");
//key->SetValue("WallpaperStyle", "10");
 
// по размеру
//key->SetValue("TileWallpaper", "0");
//key->SetValue("WallpaperStyle", "6");
 
// растянуть
//key->SetValue("TileWallpaper", "0");
//key->SetValue("WallpaperStyle", "2");
                 
// замостить
//key->SetValue("TileWallpaper", "1");
 
// по центру
key->SetValue("TileWallpaper", "0");
key->SetValue("WallpaperStyle", "0");
 
key->Close();
 
// обновление настроек обоев
SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, 0,
    SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);


Настройка заставки

C++
1
2
3
4
5
6
RegistryKey ^key = Registry::CurrentUser->CreateSubKey("Control Panel\

\Desktop");
key->SetValue("SCRNSAVE.EXE", "C:\\windows\\system32\\ssText3d.scr");
key->SetValue("ScreenSaveTimeOut", "60");
key->Close();
1
Геныч
Заблокирован
26.07.2014, 15:14  [ТС] 5
Интернет и сеть. System::Net

В проект необходимо включить:
  • пространство имен System::Net через using namespace

Получение данных с сетевого ресурса

Скачивание файла по ссылке

C++
1
2
3
WebClient ^wc = gcnew WebClient();
wc->DownloadFile("http://site.com/файл.zip", "D:\\файл.zip");
delete wc;
Примечания:
1) Таким способом можно скачать и сохранить на диск не только файл, но и код Web-страницы, открываемой в браузере, или иной ответ сервера.
Попробуйте передать первым аргументом строку "http://cyberforum.ru/".
2) Учтите, что скачивание большой Web-страницы (как http://cyberforum.ru/") или большого файла займет довольно много времени (в случае с http://cyberforum.ru/ это десятки секунд).
3) Скачивая Web-страницу, Вы получаете ее первозданный вариант, в том виде, в каком ее возвращает сервер, до выполнения JS-скриптов.
В браузере Вы обычно сохраняете страницу после выполнения этих скриптов. Коды страницы в том и другом случаях могут сильно различаться.
4) Примечания 1 и 2 верны и для DownloadString (см. ниже).



Получение строки string из текстового файла по ссылке

Добавьте на форму textBox1 с Multiline = true.
C++
1
2
3
WebClient ^wc = gcnew WebClient();
textBox1->Text = wc->DownloadString("http://site.com/файл.txt");
delete wc;


Скачивание файла без провисания формы (в отдельном потоке) + ProgressBar

В проект необходимо включить:
  • пространство имен System::Threading через using namespace

Добавьте на форму progressBar1.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    progressBar1->Value = 0;
    
    Thread ^t = gcnew Thread(gcnew ThreadStart(this, &Form1::Thread_Start));
    t->Start();
}
private: System::Void Thread_Start() {
    WebClient ^wc = gcnew WebClient();
    wc->DownloadProgressChanged += gcnew DownloadProgressChangedEventHandler(this, &Form1::wc_DownloadProgressChanged);
    wc->DownloadFileCompleted += gcnew AsyncCompletedEventHandler(this, &Form1::wc_DownloadFileCompleted);
    wc->DownloadFileAsync(gcnew Uri("http://go.microsoft.com/?linkid=7729279"), "D:\\vcsetup.exe");
}
private: System::Void wc_DownloadProgressChanged(System::Object ^sender, DownloadProgressChangedEventArgs ^e) {
    Invoke(gcnew Action<int>(this, &Form1::Changepbar), e->ProgressPercentage);
}
private: System::Void Changepbar(int progress) {
    this->progressBar1->Value = progress;
}
private: System::Void wc_DownloadFileCompleted(System::Object ^sender, AsyncCompletedEventArgs ^e) {
    delete sender;
}


Получение строки string из текстового файла без провисания формы (в отдельном потоке) + ProgressBar

В проект необходимо включить:
  • пространство имен System::Threading через using namespace
Добавьте на форму textBox1 с Multiline = true и progressBar1.
C++
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
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    progressBar1->Value = 0;
 
    Thread ^t = gcnew Thread(gcnew ThreadStart(this, &Form1::Thread_Start));
    t->Start();
}
private: System::Void Thread_Start() {
    WebClient ^wc = gcnew WebClient();
    wc->DownloadProgressChanged += gcnew DownloadProgressChangedEventHandler(this, &Form1::wc_DownloadProgressChanged);
    wc->DownloadStringCompleted += gcnew DownloadStringCompletedEventHandler(this, &Form1::wc_DownloadStringCompleted);
    wc->DownloadStringAsync(gcnew Uri("ссылка на файл"));
}
private: System::Void wc_DownloadProgressChanged(System::Object ^sender, DownloadProgressChangedEventArgs ^e) {
    Invoke(gcnew Action<int>(this, &Form1::Changepbar), e->ProgressPercentage);
}
private: System::Void Changepbar(int progress) {
    this->progressBar1->Value = progress;
    this->progressBar1->Invalidate();
    Application::DoEvents();
}
private: System::Void wc_DownloadStringCompleted(System::Object ^sender, DownloadStringCompletedEventArgs ^e) {
    Invoke(gcnew Action<String^>(this, &Form1::ShowResult), e->Result);
    delete sender;
}
private: System::Void ShowResult(String^ result) {
    this->textBox1->Text = result;
}


Электронная почта

Внимание! Будьте аккуратны, тестируйте только на своих почтовых ящиках!
За письма, отправленные абы куда, абы кому и абы зачем в связи с тестированием моих кодов я не в ответе

Отправка почты через SMTP-сервер


Необходимо подключить:
  • пространство имён System::Net
    C++
    1
    
    using namespace System::Net; // NetworkCredential
  • пространство имён System::Net::Mail
    C++
    1
    
    using namespace System::Net::Mail; // SmtpClient, SmtpDeliveryMethod

C++
1
2
3
4
5
6
7
SmtpClient ^client = gcnew SmtpClient("smtp.yandex.ru");
/* или другой SMTP-сервер, см. список ниже */
 
client->EnableSsl = true;
client->Credentials = gcnew NetworkCredential(/* логин отправителя (часть имени ящика до @)*/, /* пароль ящика отправителя */);
client->DeliveryMethod = SmtpDeliveryMethod::Network;
client->Send(/* ящик отправителя */, /* ящик получателя */, "тема письма", "текст письма");
Примечание: чтобы отправить письмо на несколько ящиков, укажите их в ящике отправителя через запятую
Пример: ivanov@yandex.ru,petrov@rambler.ru



Некоторые SMTP-серверы

smtp.mail.ru
smtp.yandex.ru
smtp.gmail.com
smtp.rambler.ru
smtp.qip.ru



Отправка почты через SMTP-сервер с вложением файла в письмо


В этом случае необходимо создать объект MailMessage, в нем указать адрес отправителя, получателя, тему и текст письма и добавить вложение в коллецию Attachments. Затем создать SmtpClient, все сделать, как в предыдущем коде, и в Send вместо того, что передавалось там, передать этот MailMessage.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// textBox1 - отправитель
// textBox4 - получатель
// textBox2 и textBox3 - тема и текст письма
// maskedTextBox1 - пароль от ящика отправителя
// comboBox1 - smtp-сервер отправителя
MailMessage ^msg = gcnew MailMessage(textBox1->Text, textBox4->Text, textBox2->Text, textBox3->Text);
             
if (System::IO::File::Exists(textBox5->Text))
    msg->Attachments->Add(gcnew Attachment(textBox5->Text));
 
SmtpClient ^client = gcnew SmtpClient(comboBox1->SelectedItem->ToString());
client->EnableSsl = true;
client->Credentials = gcnew NetworkCredential(textBox1->Text->Split('@')[0], maskedTextBox1->Text);
client->DeliveryMethod = SmtpDeliveryMethod::Network;
client->Send(msg);


Отправка почты через SMTP-сервер с поддержкой HTML-кода в письме


В принципе, ничего особенного и не требуется. Достаточно слегка видоизменить код из предыдущего проекта, который с MailMessage.
C++
1
2
3
MailMessage ^msg = gcnew MailMessage(..., ..., ..., "<b>Жирный</b><i>Курсив</i>");
msg->IsBodyHtml = true;
...


Получение писем из ящика по протоколу POP3 с помощью библиотеки OpenPOP.NET

В отличие от протокола исходящей почты SMTP (см. выше), какие-либо средства для работы по протоколам входящей почты - POP3 и IMAP - в платформу .NET не включены.
Для получения писем из почтового ящика по протоколу POP3 (о IMAP - позже) необходимо использовать ту или иную библиотеку сторонней разработки, выложенную в Интернет.
Я выбрал библиотеку OpenPOP.NET как простую, удобную и бесплатную. Прочитал на ней на одном из форумов, кажется, StackOverflow.com

Необходимо подключить к проекту:
  • библиотеку OpenPop.dll (это и есть OpenPOP.NET), добавив на неё ссылку через меню Проект -> Свойства
  • пространство имен OpenPop::Pop3 из этой библиотеки - через using namespace

Внимание!
1. Библиотеку OpenPop.dll нужно положить рядом со скомпилированным exe, и добавлять в проект именно оттуда.
2. Чтобы получение писем работало, нужно включить специальную опцию в настройках Вашего почтового сервиса.
Обычно такая опция бывает в разделе Почтовые клиенты или Почтовые программы.
В Яндексе эта опция здесь: https://mail.yandex.ru/neo2/#setup/client

Примечание: по POP можно стабильно получать почту только из папки Входящие.
Возможность получения почты в других папках зависит от почтового сервиса и его настроек.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Pop3Client ^client = gcnew Pop3Client();
                 
client->Connect("pop.mail.ru", 995, true);
             
client->Authenticate("ящик@mail.ru", "пароль");
 
int iMsgCount = client->GetMessageCount();
 
for (int i = iMsgCount; i > 0; i--) {
    OpenPop::Mime::Message ^msg = client->GetMessage(i);
    // Основные данные о письме:
    // msg->Headers->From->Address - ящик отправителя
    // msg->Headers->To - ящик(и) получателя(ей)
    // msg->Headers->Subject - тема письма
    // System::Text::Encoding::Default->GetString(msg->MessagePart->Body) - содержание письма
}
 
delete client;
1
tezaurismosis
Администратор
Эксперт .NET
8551 / 3845 / 725
Регистрация: 17.04.2012
Сообщений: 8,548
Записей в блоге: 14
27.10.2015, 19:14 6
Если вы хотите что-то добавить к теме, а также обсудить решения или нашли ошибку: добро пожаловать в тему-обсуждение.
0
27.10.2015, 19:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2015, 19:14

Тестирование полезных скриптов
В этой теме нужно писать: - о багах в выложенных полезных скриптах...

Не Большой Набор Полезных Функций
Функция проверки на наличие не запрещенных символов в поле, где ? - запрещенные...

Тестирование полезных кодов и примеров
Если Ваш код из темы http://www.cyberforum.ru/visual-basic/thread704248.html ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru