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.
Az alábbi eljárás és példa bemutatja, hogy egy platformhívást használó felügyelt alkalmazás hogyan tudja kinyomtatni a leíró értékét a helyi számítógépen lévő egyes ablakokhoz. Az eljárás és a példa az EnumWindows függvénnyel lépeget az ablakok listájában, és egy felügyelt visszahívási függvény (CallBack) segítségével nyomtatja ki az ablakleíró értékét.
Visszahívási függvény implementálása
Mielőtt továbblép a megvalósításra, tekintse meg az EnumWindows függvény aláírását. Az EnumWindows a következő aláírást tartalmazza:
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
A függvény visszahívást igénylő egyik nyoma az lpEnumFunc argumentum jelenléte. Gyakori, hogy az lp (hosszú mutató) előtag és a Func utótag szerepel azon argumentumok nevében, amelyek egy visszahívási függvényhez viszik az egérmutatót. A Win32-függvényekkel kapcsolatos dokumentációt a Microsoft Platform SDK-ban találja.
Hozza létre a felügyelt visszahívási függvényt. A példa deklarál egy delegálttípust, amelynek neve
CallBack
két argumentumot vesz fel (hwnd és lparam). Az első argumentum az ablak fogópontja; a második argumentum alkalmazás által definiált. Ebben a kiadásban mindkét argumentumnak egész számnak kell lennie.A visszahívási függvények általában nonzero értékeket adnak vissza a sikeresség, a nullát pedig a hiba jelzésére. Ez a példa kifejezetten igaz értékre állítja a visszatérési értéket az enumerálás folytatásához.
Hozzon létre egy delegáltat, és adja át argumentumként az EnumWindows függvénynek . A platformhívás automatikusan ismerős visszahívási formátummá alakítja a meghatalmazottat.
Győződjön meg arról, hogy a szemétgyűjtő nem vonja vissza a meghatalmazottat, mielőtt a visszahívási függvény befejezi a munkáját. Ha paraméterként ad át egy meghatalmazottat, vagy egy struktúra mezőjeként megadott meghatalmazottat ad át, az a hívás időtartama alatt nem lesz megadva. A következő számbavételi példához hasonlóan a visszahívási függvény a hívás visszatérése előtt befejezi a munkáját, és nem igényel további műveletet a felügyelt hívótól.
Ha azonban a visszahívási függvény a hívás visszatérése után is meghívható, a felügyelt hívónak lépéseket kell tennie annak érdekében, hogy a delegált ne maradjon vissza, amíg a visszahívási függvény be nem fejeződik. Példaként tekintse meg a GCHandle-mintát.
Példa
Imports System
Imports System.Runtime.InteropServices
Public Delegate Function CallBack( _
hwnd As Integer, lParam As Integer) As Boolean
Public Class EnumReportApp
Declare Function EnumWindows Lib "user32" ( _
x As CallBack, y As Integer) As Integer
Public Shared Sub Main()
EnumWindows(AddressOf EnumReportApp.Report, 0)
End Sub 'Main
Public Shared Function Report(hwnd As Integer, lParam As Integer) _
As Boolean
Console.Write("Window handle is ")
Console.WriteLine(hwnd)
Return True
End Function 'Report
End Class 'EnumReportApp
using System;
using System.Runtime.InteropServices;
public delegate bool CallBack(int hwnd, int lParam);
public class EnumReportApp
{
[DllImport("user32")]
public static extern int EnumWindows(CallBack x, int y);
public static void Main()
{
CallBack myCallBack = new CallBack(EnumReportApp.Report);
EnumWindows(myCallBack, 0);
}
public static bool Report(int hwnd, int lParam)
{
Console.Write("Window handle is ");
Console.WriteLine(hwnd);
return true;
}
}
using namespace System;
using namespace System::Runtime::InteropServices;
// A delegate type.
delegate bool CallBack(int hwnd, int lParam);
// Managed type with the method to call.
ref class EnumReport
{
// Report the window handle.
public:
[DllImport("user32")]
static int EnumWindows(CallBack^ x, int y);
static void Main()
{
EnumReport^ er = gcnew EnumReport;
CallBack^ myCallBack = gcnew CallBack(&EnumReport::Report);
EnumWindows(myCallBack, 0);
}
static bool Report(int hwnd, int lParam)
{
Console::Write(L"Window handle is ");
Console::WriteLine(hwnd);
return true;
}
};
int main()
{
EnumReport::Main();
}