Operace systému Windows (C++/CLI)

Demonstruje různé Windows úlohy specifické pro jednotlivé uživatele pomocí Windows SDK.

Následující témata ukazují různé Windows operace prováděné se sadou SDK Windows pomocí Visual C++.

Určení, jestli se zahájilo vypnutí

Následující příklad kódu ukazuje, jak určit, zda aplikace nebo .NET Framework je aktuálně ukončující. To je užitečné pro přístup ke statickým prvkům v .NET Framework, protože během vypínání jsou tyto konstrukce finalizovány systémem a nelze je spolehlivě použít. Kontrolou vlastnosti HasShutdownStarted se můžete vyhnout potenciálním selháním tím, že k těmto prvkům nepřistupujete.

Příklad

// 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;
}

Určení interaktivního stavu uživatele

Následující příklad kódu ukazuje, jak určit, zda je kód spuštěn v uživatelsky interaktivním kontextu. Pokud má UserInteractive hodnotu false, pak je kód spuštěný jako proces služby nebo z webové aplikace. V takovém případě byste se neměli pokoušet o interakci s uživatelem.

Příklad

// user_interactive.cpp
// compile with: /clr
using namespace System;

int main()
{
   if ( Environment::UserInteractive )
      Console::WriteLine("User interactive");
   else
      Console::WriteLine("Noninteractive");
   return 0;
}

Čtení dat z registru Windows Registry

Následující příklad kódu používá klíč CurrentUser ke čtení dat z Windows registru. Nejprve se podklíče vyčíslí pomocí metody GetSubKeyNames a potom se podklíč Identity otevře pomocí metody OpenSubKey. Podobně jako kořenové klíče je každý podklíč reprezentován třídou RegistryKey. Nový objekt RegistryKey se nakonec použije k vytvoření výčtu párů klíč-hodnota.

Příklad

// 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;
}

Poznámky

Třída Registry je pouze kontejnerem pro statické instance RegistryKey. Každá instance představuje kořenový uzel registru. Instance jsou ClassesRoot,CurrentConfig,CurrentUser,LocalMachinea Users.

Objekty ve třídě Registry jsou nejen statické, ale jen pro čtení. Instance třídy RegistryKey vytvořené pro přístup k obsahu objektů registru jsou také jen pro čtení. Příklad přepsání tohoto chování najdete v tématu Postupy: Zápis dat do registru Windows (C++/CLI).

Ve třídě Registru existují dva další objekty:DataData a PerformanceData. Obě jsou instance třídy RegistryKey. Objekt Data obsahuje dynamické informace registru, které jsou podporované pouze v Windows 98 a Windows Me. Objekt PerformanceData lze použít pro přístup k informacím čítače výkonu pro aplikace, které používají Windows Performance Monitoring System. Uzel PerformanceData představuje informace, které nejsou ve skutečnosti uložené v registru, a proto je nelze zobrazit pomocí Regedit.exe.

Čítače Windows výkonu pro čtení

Některé aplikace a Windows subsystémy zpřístupňuje data o výkonu prostřednictvím Windows výkonu. K těmto čítačům je možné přistupovat pomocí tříd PerformanceCounterCategory a PerformanceCounter, které se nacházejí v oboru názvů System.Diagnostics.

Následující příklad kódu používá tyto třídy k načtení a zobrazení čítače, který je aktualizován Windows označuje procento času, kdy je procesor zaneprázdněn.

Poznámka

Tento příklad vyžaduje oprávnění správce ke spuštění v Windows Vista.

Příklad

// 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;
}

Načtení textu ze schránky

Následující příklad kódu používá členská funkce GetDataObject k vrácení ukazatele na rozhraní IDataObject. Toto rozhraní se pak může dotazovat na formát dat a použít k načtení skutečných dat.

Příklad

// 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;
}

Načtení aktuálního uživatelského jména

Následující příklad kódu ukazuje načtení aktuálního uživatelského jména (jméno uživatele přihlášeného k Windows). Název je uložený v řetězci UserName, který je definovaný v oboru názvů Prostředí.

Příklad

// username.cpp
// compile with: /clr
using namespace System;

int main()
{
   Console::WriteLine("\nCurrent user: {0}", Environment::UserName);
   return 0;
}

Načtení .NET Framework verze

Následující příklad kódu ukazuje, jak určit verzi aktuálně nainstalované .NET Framework s vlastností Version, což je ukazatel na objekt Version, který obsahuje informace o verzi.

Příklad

// 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;
}

Načtení názvu místního počítače

Následující příklad kódu ukazuje načtení názvu místního počítače (název počítače, jak se zobrazuje v síti). Toho můžete dosáhnout získáním řetězce MachineName, který je definovaný v oboru názvů Prostředí.

Příklad

// machine_name.cpp
// compile with: /clr
using namespace System;

int main()
{
   Console::WriteLine("\nMachineName: {0}", Environment::MachineName);
   return 0;
}

Načtení Windows verze

Následující příklad kódu ukazuje, jak načíst informace o platformě a verzi aktuálního operačního systému. Tyto informace jsou uloženy ve vlastnosti System.Environment.OSVersion a obsahují výčet, který obecně popisuje verzi Windows, a objektu Version, který obsahuje přesné sestavení operačního systému.

Příklad

// 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;
}

Doba načítání uplynulá od spuštění

Následující příklad kódu ukazuje, jak určit počet kmitání nebo počet milisekund, které uplynuly od Windows spuštění. Tato hodnota je uložená v členu System.Environment.TickCount a vzhledem k tomu, že se jedná o 32bitovou hodnotu, se přibližně každých 24,9 dnů resetuje na nulu.

Příklad

// 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;
}

Uložení textu do schránky

Následující příklad kódu používá objekt schránky definovaný v system.Windows. Obor názvů formuláře pro uložení řetězce. Tento objekt poskytuje dvě členské funkce: SetDataObject a GetDataObject. Data se ukládají do schránky odesláním libovolného objektu odvozeného z object do objektu SetDataObject.

Příklad

// 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;
}

Zápis dat do Windows registru

Následující příklad kódu používá klíč CurrentUser k vytvoření zapisovatelné instance třídy RegistryKey odpovídající klíči softwaru. Metoda CreateSubKey se pak použije k vytvoření nového klíče a přidání do párů klíč-hodnota.

Příklad

// 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;
}

Poznámky

K přístupu k registru .NET Framework pomocí tříd Registry a RegistryKey, které jsou definované v oboru názvů Microsoft.Win32, můžete použít rozhraní . Třída Registry je kontejner pro statické instance třídy RegistryKey. Každá instance představuje kořenový uzel registru. Instance jsou ClassesRoot,CurrentConfig,CurrentUser,LocalMachinea Users.

Prostředí

Viz také

Programování pro .NET v jazyce C++/CLI (Visual C++)