Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Különböző Windows-specifikus feladatokat mutat be a Windows SDK használatával.
Az alábbi témakörök a Windows SDK-val a Visual C++ használatával végrehajtott különböző Windows-műveleteket mutatják be.
Annak megállapítása, hogy a leállítás elindult-e
Az alábbi példakód bemutatja, hogyan állapítható meg, hogy az alkalmazás vagy a .NET-keretrendszer jelenleg leáll-e. Ez azért hasznos a .NET-keretrendszer statikus elemeinek eléréséhez, mert a leállítás során ezeket a szerkezeteket a rendszer véglegesítette, és nem lehet megbízhatóan használni. A HasShutdownStarted tulajdonság ellenőrzésével először elkerülheti a lehetséges hibákat azáltal, hogy nem fér hozzá ezekhez az elemekhez.
példa
// 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;
}
Felhasználó interaktív állapotának meghatározása
Az alábbi példakód bemutatja, hogyan állapítható meg, hogy a kód felhasználó-interaktív környezetben fut-e. Ha UserInteractive hamis, akkor a kód szolgáltatásfolyamatként vagy webalkalmazáson belül fut, ebben az esetben nem szabad megkísérelnie a felhasználóval való interakciót.
példa
// user_interactive.cpp
// compile with: /clr
using namespace System;
int main()
{
if ( Environment::UserInteractive )
Console::WriteLine("User interactive");
else
Console::WriteLine("Noninteractive");
return 0;
}
Adatok olvasása a Windows-beállításjegyzékből
Az alábbi példakód a CurrentUser kulccsal olvassa be az adatokat a Windows beállításjegyzékéből. Először az alkulcsok számbavétele a GetSubKeyNames metódussal történik meg, majd a OpenSubKey metódussal megnyílik az Identitások alkulcs. A gyökérkulcshoz hasonlóan minden alkulcsot az RegistryKey osztály jelöl. Végül az új RegistryKey objektum a kulcs/érték párok számbavételére szolgál.
példa
// 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;
}
Megjegyzések
Az Registry osztály csupán egy tároló a statikus példányok RegistryKeyszámára. Minden példány egy gyökérregisztrációs csomópontot jelöl. A példányok a következők: ClassesRoot, CurrentConfig, CurrentUser, LocalMachine és Users.
A statikusság mellett az osztályon belüli Registry objektumok csak olvashatók. Ezenkívül a RegistryKey osztály azon példányai is írásvédettek, amelyeket a beállításjegyzék objektumainak tartalmához való hozzáférésre hoztak létre. Ennek a viselkedésnek a felülbírálásához lásd : Adatok írása a Windows-beállításjegyzékbe (C++/CLI).
Az osztályban Registry két további objektum található: DynData és PerformanceData. Mindkettő az RegistryKey osztály példánya. Az DynData objektum dinamikus beállításjegyzék-információkat tartalmaz, amelyeket csak a Windows 98 és a Windows Me támogat. Az PerformanceData objektum a Windows teljesítményfigyelő rendszert használó alkalmazások teljesítményszámláló információinak elérésére használható. A PerformanceData csomópont olyan információkat jelöl, amelyek valójában nem a beállításjegyzékben találhatók, ezért nem tekinthetők meg Regedit.exehasználatával.
Windows teljesítményszámlálók olvasása
Egyes alkalmazások és Windows-alrendszerek a Windows teljesítményrendszerén keresztül teszik elérhetővé a teljesítményadatokat. Ezek a számlálók a PerformanceCounterCategory és PerformanceCounter osztályok segítségével érhetők el, amelyek a System.Diagnostics névtérben találhatók.
Az alábbi példakód ezen osztályok használatával kér le és jelenít meg egy, a Windows által frissített számlálót, amely jelzi, hogy a processzor hány százaléka foglalt.
Megjegyzés:
Ez a példa rendszergazdai jogosultságokat igényel a Windows Vista rendszeren való futtatáshoz.
példa
// 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;
}
Szöveg lekérése a vágólapról
Az alábbi kódpéldában a GetDataObject tagfüggvény egy mutatót ad vissza a IDataObject felületre. Ez a felület ezután lekérdezhető az adatok formátuma alapján, és a tényleges adatok lekérésére használható.
példa
// 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;
}
Az aktuális felhasználónév lekérése
Az alábbi példakód az aktuális felhasználónév (a Windowsba bejelentkezett felhasználó neve) lekérését mutatja be. A név a UserName karakterláncban van tárolva, amely a Environment névtérben van definiálva.
példa
// username.cpp
// compile with: /clr
using namespace System;
int main()
{
Console::WriteLine("\nCurrent user: {0}", Environment::UserName);
return 0;
}
A .NET-keretrendszer verziójának lekérése
Az alábbi példakód bemutatja, hogyan határozható meg az aktuálisan telepített .NET-keretrendszer verziója a Version tulajdonsággal, amely a verzióinformációkat tartalmazó objektumra Version mutató mutató.
példa
// 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;
}
A helyi gép nevének lekérése
Az alábbi példakód bemutatja a helyi gép nevének lekérését (a számítógép nevét, ahogy az egy hálózaton megjelenik). Ehhez szerezze meg azt a MachineName sztringet, amely a Environment névtérben van definiálva.
példa
// machine_name.cpp
// compile with: /clr
using namespace System;
int main()
{
Console::WriteLine("\nMachineName: {0}", Environment::MachineName);
return 0;
}
A Windows-verzió lekérése
Az alábbi példakód bemutatja, hogyan lehet lekérni az aktuális operációs rendszer platform- és verzióadatait. Ez az információ a System.Environment.OSVersion tulajdonságban van tárolva, és egy felsorolásból áll, amely a Windows verzióját írja le széles körben, és egy Version objektumból, amely tartalmazza az operációs rendszer pontos felépítését.
példa
// 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;
}
Az indítás óta eltelt idő lekérése
Az alábbi kódpélda bemutatja, hogyan határozható meg a Windows indítása óta eltelt időegységek száma vagy az eltelt ezredmásodpercek mennyisége. Ez az érték a System.Environment.TickCount tagban van tárolva, és mivel 32 bites érték, körülbelül 24,9 naponta nullára állítja vissza.
példa
// 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;
}
Szöveg tárolása a vágólapon
Az alábbi példakód a Clipboard névtérben System.Windows.Forms definiált objektumot használja egy sztring tárolására. Ez az objektum két tagfüggvényt biztosít: SetDataObject és GetDataObject. Az adatokat a vágólapon úgy tároljuk, hogy bármilyen, a Object-ből származtatott objektumot elküldünk a SetDataObject-re.
példa
// 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;
}
Adatok írása a Windows beállításjegyzékbe
Az alábbi példakód a CurrentUser kulcs használatával hozza létre a RegistryKeyszoftverkulcsnak megfelelő osztály írható példányát. A CreateSubKey metódus ezután egy új kulcs létrehozására és kulcs/érték párok hozzáadására szolgál.
példa
// 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;
}
Megjegyzések
A .NET-keretrendszer használatával elérheti a beállításjegyzéket a Registry névtérben definiált RegistryKey és Microsoft.Win32 osztályokkal. A Beállításjegyzék osztály a RegistryKey osztály statikus példányainak tárolója. Minden példány egy gyökérregisztrációs csomópontot jelöl. A példányok a következők: ClassesRoot, CurrentConfig, CurrentUser, LocalMachine és Users.