Aracılığıyla paylaş


Windows İşlemleri (C++/CLI)

Windows SDK'sını kullanarak Windows'a özgü çeşitli görevleri gösterir.

Aşağıdaki konular, Visual C++ kullanılarak Windows SDK ile gerçekleştirilen çeşitli Windows işlemlerini gösterir.

Kapatmanın Başlatılıp Başlatılmadığını Belirleme

Aşağıdaki kod örneği, uygulamanın veya .NET Framework'ün şu anda sonlandırıcı olup olmadığının nasıl belirleneceğini gösterir. Kapatma sırasında bu yapılar sistem tarafından sonlandırıldığından ve güvenilir bir şekilde kullanılamadığından bu, .NET Framework'teki statik öğelere erişmek için kullanışlıdır. Önce özelliğini denetleyerek HasShutdownStarted , bu öğelere erişmeyerek olası hataları önleyebilirsiniz.

Örnek

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

Kullanıcı Etkileşimli Durumunu Belirleme

Aşağıdaki kod örneği, kodun kullanıcı etkileşimli bir bağlamda çalıştırılıp çalıştırılmadığının nasıl belirleneceğini gösterir. False ise UserInteractive , kod bir hizmet işlemi olarak veya bir Web uygulamasının içinden çalıştırılır ve bu durumda kullanıcıyla etkileşim kurmaya çalışmamalısınız.

Örnek

// 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 Kayıt Defteri'nden Veri Okuma

Aşağıdaki kod örneği, Windows kayıt defterinden CurrentUser verileri okumak için anahtarını kullanır. İlk olarak, alt anahtarlar yöntemi kullanılarak GetSubKeyNames numaralandırılır ve ardından Identities alt anahtarı yöntemi kullanılarak OpenSubKey açılır. Kök anahtarlar gibi her alt anahtar da sınıfı tarafından RegistryKey temsil edilir. Son olarak, yeni RegistryKey nesne anahtar/değer çiftlerini numaralandırmak için kullanılır.

Örnek

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

Açıklamalar

Registry sınıfı yalnızca statik örnekleri için bir kapsayıcıdırRegistryKey. Her örnek bir kök kayıt defteri düğümünü temsil eder. Örnekler , , CurrentConfigCurrentUser, LocalMachineve UsersşeklindedirClassesRoot.

Statik olmasının yanı sıra, sınıfındaki Registry nesneler salt okunur olur. Ayrıca, kayıt defteri nesnelerinin RegistryKey içeriğine erişmek için oluşturulan sınıfın örnekleri de salt okunur olur. Bu davranışı geçersiz kılma örneği için bkz . Nasıl yapılır: Windows Kayıt Defterine Veri Yazma (C++/CLI).

sınıfında iki ek nesne Registry daha vardır: DynData ve PerformanceData. Her ikisi de sınıfının örnekleridir RegistryKey . DynData nesnesi, yalnızca Windows 98 ve Windows Me'de desteklenen dinamik kayıt defteri bilgilerini içerir. nesnesi, PerformanceData Windows Performans İzleyicisi ing Sistemi kullanan uygulamaların performans sayacı bilgilerine erişmek için kullanılabilir. Düğüm PerformanceData , kayıt defterinde gerçekten depolanmayan bilgileri temsil eder ve bu nedenle Regedit.exe kullanılarak görüntülenemez.

Windows Performans Sayaçlarını okuma

Bazı uygulamalar ve Windows alt sistemleri, Performans verilerini Windows performans sistemi aracılığıyla kullanıma sunar. Bu sayaçlara ad alanında System.Diagnostics bulunan ve PerformanceCounter sınıfları kullanılarak PerformanceCounterCategory erişilebilir.

Aşağıdaki kod örneği, işlemcinin meşgul olduğu zaman yüzdesini belirtmek üzere Windows tarafından güncelleştirilen bir sayacı almak ve görüntülemek için bu sınıfları kullanır.

Dekont

Bu örnek, Windows Vista'da çalıştırmak için yönetici ayrıcalıkları gerektirir.

Örnek

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

Panodan Metin Alma

Aşağıdaki kod örneği, arabirime GetDataObject bir işaretçi döndürmek için IDataObject üye işlevini kullanır. Bu arabirim daha sonra verilerin biçimi için sorgulanabilir ve gerçek verileri almak için kullanılabilir.

Örnek

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

Geçerli Kullanıcı Adını Alma

Aşağıdaki kod örneği, geçerli kullanıcı adının (Windows'ta oturum açmış olan kullanıcının adı) alınmasını gösterir. Ad alanı içinde UserName tanımlanan dizede Environment depolanır.

Örnek

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

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

.NET Framework Sürümünü Alma

Aşağıdaki kod örneği, şu anda yüklü olan .NET Framework sürümünün, sürüm bilgilerini içeren bir Version nesnenin işaretçisi olan özelliğiyle Version nasıl belirleneceğini gösterir.

Örnek

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

Yerel Makine Adını Alma

Aşağıdaki kod örneği, yerel makine adının (ağdaki bilgisayarın adı) alınmasını gösterir. Bunu, ad alanında Environment tanımlanan dizeyi MachineName alarak gerçekleştirebilirsiniz.

Örnek

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

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

Windows Sürümünü Alma

Aşağıdaki kod örneği, geçerli işletim sisteminin platform ve sürüm bilgilerinin nasıl alınduğunu gösterir. Bu bilgiler özelliğinde System.Environment.OSVersion depolanır ve Windows sürümünü geniş terimlerle açıklayan bir numaralandırmadan ve işletim sisteminin tam derlemesini içeren bir Version nesneden oluşur.

Örnek

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

Başlangıçtan Bu Yana Geçen Süreyi Alma

Aşağıdaki kod örneği, Windows'un başlatılmasından bu yana geçen değer sayısını veya milisaniye sayısını belirlemeyi gösterir. Bu değer üyede System.Environment.TickCount depolanır ve 32 bitlik bir değer olduğundan yaklaşık 24,9 günde bir sıfıra sıfırlanır.

Örnek

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

Panoda Metin Depolama

Aşağıdaki kod örneği, bir dizeyi depolamak için ad alanında System.Windows.Forms tanımlanan nesneyi kullanırClipboard. Bu nesne iki üye işlevi sağlar: SetDataObject ve GetDataObject. Veri, öğesinden türetilen herhangi bir nesneye SetDataObjectgönderilerek Pano'da Object depolanır.

Örnek

// 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 Kayıt Defteri'ne Veri Yazma

Aşağıdaki kod örneği, Yazılım anahtarına CurrentUser karşılık gelen sınıfın RegistryKey yazılabilir bir örneğini oluşturmak için anahtarını kullanır. Yöntemi CreateSubKey daha sonra yeni bir anahtar oluşturmak ve anahtar/değer çiftlerine eklemek için kullanılır.

Örnek

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

Açıklamalar

Kayıt defterine ve sınıfları ile RegistryRegistryKey erişmek için .NET Framework kullanabilirsiniz ve her ikisi de ad alanında Microsoft.Win32 tanımlanmıştır. Registry sınıfı, sınıfın RegistryKey statik örnekleri için bir kapsayıcıdır. Her örnek bir kök kayıt defteri düğümünü temsil eder. Örnekler , , CurrentConfigCurrentUser, LocalMachineve UsersşeklindedirClassesRoot.

Environment

Ayrıca bkz.

C++/CLI (Visual C++) ile .NET Programlama