Bagikan melalui


Operasi Windows (C++/CLI)

Menunjukkan berbagai tugas khusus Windows menggunakan Windows SDK.

Topik berikut menunjukkan berbagai operasi Windows yang dilakukan dengan Windows SDK menggunakan Visual C++.

Menentukan apakah Matikan Telah Dimulai

Contoh kode berikut menunjukkan cara menentukan apakah aplikasi atau .NET Framework saat ini sedang dihentikan. Ini berguna untuk mengakses elemen statis dalam .NET Framework karena, selama pematian, konstruksi ini diselesaikan oleh sistem dan tidak dapat digunakan dengan andal. Dengan memeriksa properti terlebih HasShutdownStarted dahulu, Anda dapat menghindari potensi kegagalan dengan tidak mengakses elemen-elemen ini.

Contoh

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

Menentukan Status Interaktif Pengguna

Contoh kode berikut menunjukkan cara menentukan apakah kode dijalankan dalam konteks interaktif pengguna. Jika UserInteractive salah, maka kode berjalan sebagai proses layanan atau dari dalam aplikasi Web, dalam hal ini Anda tidak boleh mencoba berinteraksi dengan pengguna.

Contoh

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

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

Membaca Data dari Windows Registry

Contoh kode berikut menggunakan kunci untuk membaca data dari registri CurrentUser Windows. Pertama, subkunci dijumlahkan menggunakan GetSubKeyNames metode dan kemudian subkunci Identitas dibuka menggunakan OpenSubKey metode . Seperti kunci akar, setiap subkunjuk diwakili oleh RegistryKey kelas . Terakhir, objek baru RegistryKey digunakan untuk menghitung pasangan kunci/nilai.

Contoh

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

Keterangan

Kelas Registry ini hanyalah kontainer untuk instans statis .RegistryKey Setiap instans mewakili simpul registri root. Instansnya adalah ClassesRoot, , CurrentConfigCurrentUser, LocalMachine, dan Users.

Selain statis, objek dalam Registry kelas bersifat baca-saja. Selain itu, instans RegistryKey kelas yang dibuat untuk mengakses konten objek registri juga bersifat baca-saja. Untuk contoh cara mengambil alih perilaku ini, lihat Cara: Menulis Data ke Windows Registry (C++/CLI).

Ada dua objek tambahan di Registry kelas : DynData dan PerformanceData. Keduanya adalah instans RegistryKey kelas. Objek DynData berisi informasi registri dinamis, yang hanya didukung di Windows 98 dan Windows Me. Objek PerformanceData dapat digunakan untuk mengakses informasi penghitung kinerja untuk aplikasi yang menggunakan Sistem Pemantauan Performa Windows. Simpul PerformanceData mewakili informasi yang sebenarnya tidak disimpan dalam registri dan karenanya tidak dapat dilihat menggunakan Regedit.exe.

Membaca Penghitung Kinerja Windows

Beberapa aplikasi dan subsistem Windows mengekspos data performa melalui sistem performa Windows. Penghitung ini dapat diakses menggunakan PerformanceCounterCategory kelas dan PerformanceCounter , yang berada di System.Diagnostics namespace layanan.

Contoh kode berikut menggunakan kelas ini untuk mengambil dan menampilkan penghitung yang diperbarui oleh Windows untuk menunjukkan persentase waktu prosesor sibuk.

Catatan

Contoh ini memerlukan hak administratif untuk dijalankan pada Windows Vista.

Contoh

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

Mengambil Teks dari Clipboard

Contoh kode berikut menggunakan GetDataObject fungsi anggota untuk mengembalikan penunjuk ke IDataObject antarmuka. Antarmuka ini kemudian dapat dikueri untuk format data dan digunakan untuk mengambil data aktual.

Contoh

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

Mengambil Nama Pengguna Saat Ini

Contoh kode berikut menunjukkan pengambilan nama pengguna saat ini (nama pengguna yang masuk ke Windows). Nama disimpan dalam UserName string, yang didefinisikan dalam Environment namespace.

Contoh

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

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

Mengambil Versi .NET Framework

Contoh kode berikut menunjukkan cara menentukan versi .NET Framework yang saat ini diinstal dengan Version properti , yang merupakan penunjuk ke Version objek yang berisi informasi versi.

Contoh

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

Mengambil Nama Komputer Lokal

Contoh kode berikut menunjukkan pengambilan nama komputer lokal (nama komputer seperti yang muncul di jaringan). Anda dapat menyelesaikan ini dengan mendapatkan MachineName string, yang didefinisikan dalam Environment namespace.

Contoh

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

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

Mengambil Versi Windows

Contoh kode berikut menunjukkan cara mengambil informasi platform dan versi sistem operasi saat ini. Informasi ini disimpan dalam System.Environment.OSVersion properti dan terdiri dari enumerasi yang menjelaskan versi Windows dalam istilah luas dan Version objek yang berisi build sistem operasi yang tepat.

Contoh

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

Ambil Waktu Berlalu Sejak Startup

Contoh kode berikut menunjukkan cara menentukan jumlah centang, atau jumlah milidetik yang telah berlalu sejak Windows dimulai. Nilai ini disimpan dalam System.Environment.TickCount anggota dan, karena merupakan nilai 32-bit, diatur ulang menjadi nol kira-kira setiap 24,9 hari.

Contoh

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

Simpan Teks di Clipboard

Contoh kode berikut menggunakan objek yang Clipboard ditentukan dalam System.Windows.Forms namespace untuk menyimpan string. Objek ini menyediakan dua fungsi anggota: SetDataObject dan GetDataObject. Data disimpan di Clipboard dengan mengirim objek apa pun yang berasal dari Object ke SetDataObject.

Contoh

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

Menulis Data ke Registri Windows

Contoh kode berikut menggunakan kunci untuk membuat instans CurrentUserRegistryKey kelas yang dapat ditulis yang sesuai dengan kunci Perangkat Lunak . Metode CreateSubKey ini kemudian digunakan untuk membuat kunci baru dan menambahkan ke pasangan kunci/nilai.

Contoh

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

Keterangan

Anda dapat menggunakan .NET Framework untuk mengakses registri dengan Registry kelas dan RegistryKey , yang keduanya ditentukan dalam Microsoft.Win32 namespace. Kelas Registri adalah kontainer untuk instans RegistryKey statis kelas. Setiap instans mewakili simpul registri root. Instansnya adalah ClassesRoot, , CurrentConfigCurrentUser, LocalMachine, dan Users.

Environment

Lihat juga

Pemrograman .NET dengan C++/CLI (Visual C++)