Nasıl yapılır: Geri çağırma işlevlerini uygulama

Aşağıdaki yordam ve örnek, platform çağrısı kullanarak yönetilen bir uygulamanın yerel bilgisayardaki her pencere için tanıtıcı değerini nasıl yazdırabileceğini gösterir. Özellikle, yordam ve örnek pencere tutamacının değerini yazdırmak için EnumWindows işlevini kullanarak windows listesinde adım adım ilerleyip yönetilen geri çağırma işlevini (CallBack adlı) kullanır.

Geri çağırma işlevi uygulamak için

  1. Uygulamayla devam etmeden önce EnumWindows işlevinin imzasını inceleyin. EnumWindows aşağıdaki imzaya sahiptir:

    BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
    

    Bu işlevin geri çağırma gerektirdiğine ilişkin bir ipucu lpEnumFunc bağımsız değişkeninin varlığıdır. Bir geri çağırma işlevinin işaretçisini alan bağımsız değişkenlerin adında Func soneki ile birleştirilmiş lp (uzun işaretçi) ön ekini görmek yaygın bir durumdur. Win32 işlevleri hakkında belgeler için bkz. Microsoft Platform SDK'sı.

  2. Yönetilen geri çağırma işlevini oluşturun. Örnek, adlı CallBackve iki bağımsız değişken (hwnd ve lparam) alan bir temsilci türü bildirir. İlk bağımsız değişken pencerenin tutamacıdır; ikinci bağımsız değişken uygulama tanımlıdır. Bu sürümde her iki bağımsız değişken de tamsayı olmalıdır.

    Geri çağırma işlevleri genellikle başarıyı göstermek için sıfır olmayan değerler, başarısızlığı belirtmek için de sıfır döndürür. Bu örnek, numaralandırmaya devam etmek için dönüş değerini açıkça true olarak ayarlar.

  3. Bir temsilci oluşturun ve bunu EnumWindows işlevine bağımsız değişken olarak geçirin. Platform çağrısı, temsilciyi otomatik olarak tanıdık bir geri çağırma biçimine dönüştürür.

  4. Geri çağırma işlevi işini tamamlamadan önce çöp toplayıcının temsilciyi geri kazanmadığından emin olun. Bir temsilciyi parametre olarak geçirdiğinizde veya bir yapıda alan olarak bulunan bir temsilciyi geçirdiğinizde, çağrı süresi boyunca toplamadan kalır. Bu nedenle, aşağıdaki numaralandırma örneğinde olduğu gibi, geri çağırma işlevi çağrı döndürülmeden önce çalışmasını tamamlar ve yönetilen çağıranın ek bir eylemini gerektirmez.

    Ancak, geri çağırma işlevi çağrı döndürdükten sonra çağrılabiliyorsa, yönetilen çağıranın geri çağırma işlevi bitene kadar temsilcinin toplamadan kaldığından emin olmak için adımlar atması gerekir. Örnek için GCHandle örneğine bakın.

Örnek

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();  
}  

Ayrıca bkz.