Bagikan melalui


Cara: Menerapkan fungsi panggilan balik

Prosedur dan contoh berikut menunjukkan cara aplikasi terkelola, menggunakan pemanggilan platform, dapat mencetak nilai handel untuk setiap jendela di komputer lokal. Secara khusus, prosedur dan contoh menggunakan fungsi EnumWindows untuk menelusuri daftar jendela dan fungsi panggilan balik terkelola (bernama CallBack) untuk mencetak nilai handel jendela.

Untuk mengimplementasikan fungsi panggilan balik

  1. Lihat tanda tangan untuk fungsi EnumWindows sebelum melangkah lebih jauh dengan implementasi. EnumWindows memiliki tanda tangan berikut:

    BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
    

    Salah satu petunjuk bahwa fungsi ini memerlukan panggilan balik adalah adanya argumen lpEnumFunc. Umum untuk melihat awalan lp (penunjuk panjang) yang dikombinasikan dengan akhiran Func dalam nama argumen yang mengambil penunjuk ke fungsi panggilan balik. Untuk dokumentasi tentang fungsi Win32, lihat SDK Platform Microsoft.

  2. Buat fungsi panggilan balik terkelola. Contoh mendeklarasikan jenis delegasi, yang disebut CallBack, yang mengambil dua argumen (hwnd dan lparam). Argumen pertama adalah handel ke jendela; argumen kedua ditentukan aplikasi. Dalam rilis ini, kedua argumen harus berupa bilangan bulat.

    Fungsi panggilan balik umumnya mengembalikan nilai bukan nol untuk menunjukkan keberhasilan dan nol untuk menunjukkan kegagalan. Contoh ini secara eksplisit mengatur nilai yang dikembalikan ke true untuk melanjutkan enumerasi.

  3. Buat delegasi dan teruskan sebagai argumen ke fungsi EnumWindows. Pemanggilan platform mengonversi delegasi ke format panggilan balik yang sudah dikenal secara otomatis.

  4. Pastikan bahwa pengumpul sampah tidak mengklaim kembali delegasi sebelum fungsi panggilan balik menyelesaikan pekerjaannya. Saat Anda meneruskan delegasi sebagai parameter, atau meneruskan delegasi yang terkandung sebagai bidang dalam struktur, delegasi tersebut tetap tidak dipilih selama durasi panggilan. Jadi, seperti halnya dalam contoh enumerasi berikut, fungsi panggilan balik menyelesaikan pekerjaannya sebelum panggilan kembali dan tidak memerlukan tindakan tambahan oleh pemanggil terkelola.

    Namun, jika fungsi panggilan balik dapat dipanggil setelah panggilan kembali, pemanggil terkelola harus mengambil langkah-langkah untuk memastikan bahwa delegasi tetap tidak dipilih sampai fungsi panggilan balik selesai. Misalnya, lihat sampel GCHandle.

Contoh

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

Lihat juga