Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Демонстрирует различные задачи, относящиеся к Windows, с помощью пакета SDK для Windows.
В следующих разделах показаны различные операции Windows, выполняемые с помощью пакета SDK для Windows с помощью Visual C++.
Определить, начался ли процесс завершения работы
В следующем примере кода показано, как определить, является ли приложение или платформа .NET Framework в настоящее время завершающимся. Это полезно для доступа к статическим элементам в платформе .NET Framework, так как во время завершения работы эти конструкции финализируются системой и не могут надежно использоваться. Сначала проверяя HasShutdownStarted свойство, можно избежать потенциальных сбоев, не обращаюсь к этим элементам.
Пример
// check_shutdown.cpp
// compile with: /clr
using namespace System;
int main()
{
if (Environment::HasShutdownStarted)
Console::WriteLine("Shutting down.");
else
Console::WriteLine("Not shutting down.");
return 0;
}
Определение интерактивного состояния пользователя
В следующем примере кода показано, как определить, выполняется ли код в интерактивном контексте пользователя. Если UserInteractive значение равно false, то код выполняется как процесс службы или из веб-приложения, в этом случае не следует пытаться взаимодействовать с пользователем.
Пример
// user_interactive.cpp
// compile with: /clr
using namespace System;
int main()
{
if ( Environment::UserInteractive )
Console::WriteLine("User interactive");
else
Console::WriteLine("Noninteractive");
return 0;
}
Чтение данных из реестра Windows
В следующем примере кода используется ключ CurrentUser для чтения данных из реестра Windows. Во-первых, вложенные ключи перечисляются с помощью GetSubKeyNames метода, а затем с помощью метода открывается вложенный OpenSubKey ключ удостоверений. Как и корневые ключи, каждый подраздел представлен классом RegistryKey . Наконец, новый RegistryKey объект используется для перечисления пар "ключ-значение".
Пример
// registry_read.cpp
// compile with: /clr
using namespace System;
using namespace Microsoft::Win32;
int main( )
{
array<String^>^ key = Registry::CurrentUser->GetSubKeyNames( );
Console::WriteLine("Subkeys within CurrentUser root key:");
for (int i=0; i<key->Length; i++)
{
Console::WriteLine(" {0}", key[i]);
}
Console::WriteLine("Opening subkey 'Identities'...");
RegistryKey^ rk = nullptr;
rk = Registry::CurrentUser->OpenSubKey("Identities");
if (rk==nullptr)
{
Console::WriteLine("Registry key not found - aborting");
return -1;
}
Console::WriteLine("Key/value pairs within 'Identities' key:");
array<String^>^ name = rk->GetValueNames( );
for (int i=0; i<name->Length; i++)
{
String^ value = rk->GetValue(name[i])->ToString();
Console::WriteLine(" {0} = {1}", name[i], value);
}
return 0;
}
Замечания
Класс Registry — это просто контейнер для статических экземпляров RegistryKey. Каждый экземпляр представляет собой корневой узел реестра. Экземпляры: ClassesRoot, CurrentConfig, CurrentUser, LocalMachine и Users.
Помимо статического, объекты в Registry классе доступны только для чтения. Кроме того, экземпляры класса, созданного RegistryKey для доступа к содержимому объектов реестра, также доступны только для чтения. Пример переопределения этого поведения см. в статье "Практическое руководство. Запись данных в реестр Windows (C++/CLI)".
В классе есть два дополнительных Registry объекта: DynData и PerformanceData. Оба являются экземплярами RegistryKey класса. Объект DynData содержит сведения о динамическом реестре, который поддерживается только в Windows 98 и Windows Me. Объект PerformanceData можно использовать для доступа к сведениям счетчика производительности для приложений, использующих систему Монитор производительности Windows. Узел PerformanceData представляет сведения, которые не хранятся в реестре и поэтому не могут просматриваться с помощью Regedit.exe.
Чтение счетчиков производительности Windows
Некоторые приложения и подсистемы Windows предоставляют данные о производительности через систему производительности Windows. Можно получить доступ к этим счетчикам, используя классы PerformanceCounterCategory и PerformanceCounter, которые находятся в пространстве имен System.Diagnostics.
В следующем примере кода эти классы используются для получения и отображения счетчика, обновляемого Windows, чтобы указать процент времени, в течение которого обработчик занят.
Примечание.
В этом примере требуются права администратора для работы в Windows Vista.
Пример
// processor_timer.cpp
// compile with: /clr
#using <system.dll>
using namespace System;
using namespace System::Threading;
using namespace System::Diagnostics;
using namespace System::Timers;
ref struct TimerObject
{
public:
static String^ m_instanceName;
static PerformanceCounter^ m_theCounter;
public:
static void OnTimer(Object^ source, ElapsedEventArgs^ e)
{
try
{
Console::WriteLine("CPU time used: {0,6} ",
m_theCounter->NextValue( ).ToString("f"));
}
catch(Exception^ e)
{
if (dynamic_cast<InvalidOperationException^>(e))
{
Console::WriteLine("Instance '{0}' does not exist",
m_instanceName);
return;
}
else
{
Console::WriteLine("Unknown exception... ('q' to quit)");
return;
}
}
}
};
int main()
{
String^ objectName = "Processor";
String^ counterName = "% Processor Time";
String^ instanceName = "_Total";
try
{
if ( !PerformanceCounterCategory::Exists(objectName) )
{
Console::WriteLine("Object {0} does not exist", objectName);
return -1;
}
}
catch (UnauthorizedAccessException ^ex)
{
Console::WriteLine("You are not authorized to access this information.");
Console::Write("If you are using Windows Vista, run the application with ");
Console::WriteLine("administrative privileges.");
Console::WriteLine(ex->Message);
return -1;
}
if ( !PerformanceCounterCategory::CounterExists(
counterName, objectName) )
{
Console::WriteLine("Counter {0} does not exist", counterName);
return -1;
}
TimerObject::m_instanceName = instanceName;
TimerObject::m_theCounter = gcnew PerformanceCounter(
objectName, counterName, instanceName);
System::Timers::Timer^ aTimer = gcnew System::Timers::Timer();
aTimer->Elapsed += gcnew ElapsedEventHandler(&TimerObject::OnTimer);
aTimer->Interval = 1000;
aTimer->Enabled = true;
aTimer->AutoReset = true;
Console::WriteLine("reporting CPU usage for the next 10 seconds");
Thread::Sleep(10000);
return 0;
}
Получение текста из буфера обмена
В следующем примере кода функция-член GetDataObject используется для возврата указателя на интерфейс IDataObject. Затем этот интерфейс можно запросить формат данных и использовать для получения фактических данных.
Пример
// read_clipboard.cpp
// compile with: /clr
#using <system.dll>
#using <system.Drawing.dll>
#using <system.windows.forms.dll>
using namespace System;
using namespace System::Windows::Forms;
[STAThread] int main( )
{
IDataObject^ data = Clipboard::GetDataObject( );
if (data)
{
if (data->GetDataPresent(DataFormats::Text))
{
String^ text = static_cast<String^>
(data->GetData(DataFormats::Text));
Console::WriteLine(text);
}
else
Console::WriteLine("Nontext data is in the Clipboard.");
}
else
{
Console::WriteLine("No data was found in the Clipboard.");
}
return 0;
}
Получение текущего имени пользователя
В следующем примере кода показано получение текущего имени пользователя (имя пользователя, вошедшего в Windows). Имя хранится в строке UserName , которая определяется в Environment пространстве имен.
Пример
// username.cpp
// compile with: /clr
using namespace System;
int main()
{
Console::WriteLine("\nCurrent user: {0}", Environment::UserName);
return 0;
}
Получение версии платформы .NET Framework
В следующем примере кода показано, как определить версию текущей установленной платформы .NET Framework с помощью свойства Version, которое является указателем на объект Version, содержащий сведения о версии.
Пример
// dotnet_ver.cpp
// compile with: /clr
using namespace System;
int main()
{
Version^ version = Environment::Version;
if (version)
{
int build = version->Build;
int major = version->Major;
int minor = version->Minor;
int revision = Environment::Version->Revision;
Console::Write(".NET Framework version: ");
Console::WriteLine("{0}.{1}.{2}.{3}",
build, major, minor, revision);
}
return 0;
}
Получение имени локального компьютера
В следующем примере кода показано получение имени локального компьютера (имя компьютера, отображаемого в сети). Для этого можно получить строку MachineName, определенную в пространстве имен Environment.
Пример
// machine_name.cpp
// compile with: /clr
using namespace System;
int main()
{
Console::WriteLine("\nMachineName: {0}", Environment::MachineName);
return 0;
}
Получение версии Windows
В следующем примере кода показано, как получить сведения о платформе и версии текущей операционной системы. Эти сведения хранятся в System.Environment.OSVersion свойстве и состоят из перечисления, описывающего версию Windows в широких терминах и Version объект, содержащий точную сборку операционной системы.
Пример
// os_ver.cpp
// compile with: /clr
using namespace System;
int main()
{
OperatingSystem^ osv = Environment::OSVersion;
PlatformID id = osv->Platform;
Console::Write("Operating system: ");
if (id == PlatformID::Win32NT)
Console::WriteLine("Win32NT");
else if (id == PlatformID::Win32S)
Console::WriteLine("Win32S");
else if (id == PlatformID::Win32Windows)
Console::WriteLine("Win32Windows");
else
Console::WriteLine("WinCE");
Version^ version = osv->Version;
if (version)
{
int build = version->Build;
int major = version->Major;
int minor = version->Minor;
int revision = Environment::Version->Revision;
Console::Write("OS Version: ");
Console::WriteLine("{0}.{1}.{2}.{3}",
build, major, minor, revision);
}
return 0;
}
Получение времени, истекшего с момента запуска
В следующем примере кода показано, как определить число галок или количество миллисекундах, прошедших с момента запуска Windows. Это значение хранится в элементе System.Environment.TickCount и, поскольку оно является 32-разрядным значением, сбрасывается до нуля примерно каждые 24,9 дня.
Пример
// startup_time.cpp
// compile with: /clr
using namespace System;
int main( )
{
Int32 tc = Environment::TickCount;
Int32 seconds = tc / 1000;
Int32 minutes = seconds / 60;
float hours = static_cast<float>(minutes) / 60;
float days = hours / 24;
Console::WriteLine("Milliseconds since startup: {0}", tc);
Console::WriteLine("Seconds since startup: {0}", seconds);
Console::WriteLine("Minutes since startup: {0}", minutes);
Console::WriteLine("Hours since startup: {0}", hours);
Console::WriteLine("Days since startup: {0}", days);
return 0;
}
Хранение текста в буфере обмена
В следующем примере кода объект, определенный Clipboard в System.Windows.Forms пространстве имен, используется для хранения строки. Этот объект предоставляет две функции-члены: SetDataObject и GetDataObject. Данные хранятся в буфере обмена путем отправки любого объекта, производного от Object, в SetDataObject.
Пример
// store_clipboard.cpp
// compile with: /clr
#using <System.dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Windows::Forms;
[STAThread] int main()
{
String^ str = "This text is copied into the Clipboard.";
// Use 'true' as the second argument if
// the data is to remain in the clipboard
// after the program terminates.
Clipboard::SetDataObject(str, true);
Console::WriteLine("Added text to the Clipboard.");
return 0;
}
Запись данных в реестр Windows
В следующем примере кода используется CurrentUser ключ для создания записываемого экземпляра класса, соответствующего RegistryKey ключу Software . Затем метод CreateSubKey используется для создания нового ключа и добавления новой пары "ключ-значение".
Пример
// registry_write.cpp
// compile with: /clr
using namespace System;
using namespace Microsoft::Win32;
int main()
{
// The second OpenSubKey argument indicates that
// the subkey should be writable.
RegistryKey^ rk;
rk = Registry::CurrentUser->OpenSubKey("Software", true);
if (!rk)
{
Console::WriteLine("Failed to open CurrentUser/Software key");
return -1;
}
RegistryKey^ nk = rk->CreateSubKey("NewRegKey");
if (!nk)
{
Console::WriteLine("Failed to create 'NewRegKey'");
return -1;
}
String^ newValue = "NewValue";
try
{
nk->SetValue("NewKey", newValue);
nk->SetValue("NewKey2", 44);
}
catch (Exception^)
{
Console::WriteLine("Failed to set new values in 'NewRegKey'");
return -1;
}
Console::WriteLine("New key created.");
Console::Write("Use REGEDIT.EXE to verify ");
Console::WriteLine("'CURRENTUSER/Software/NewRegKey'\n");
return 0;
}
Замечания
Вы можете использовать .NET Framework для доступа к реестру с классами Registry и RegistryKey, которые определены в пространстве имён Microsoft.Win32. Класс Registry — это контейнер для статических экземпляров RegistryKey класса. Каждый экземпляр представляет собой корневой узел реестра. Экземпляры: ClassesRoot, CurrentConfig, CurrentUser, LocalMachine и Users.