编写回调函数
当前位置:以往代写 > JAVA 教程 >编写回调函数
2019-06-14

编写回调函数

编写回调函数

有些Win32 API函数要求将一个函数指针作为本身的参数利用。Windows API函数随后就可以挪用自变量函数(凡是是在今后产生特定的事件时)。这一技能就叫作“回调函数”。回调函数的例子包罗窗口历程以及我们在打印进程中配置的回调(为靠山打印措施提供回调函数的地点,使其能更新状态,并在须要的时候中止打印)。
另一个例子是API函数EnumWindows(),它能列举今朝系统内所有顶级窗口。EnumWindows()要求获取一个函数指针作为本身的参数,然后搜索由Windows内部维护的一个列表。对付列表内的每个窗口,它城市挪用回调函数,将窗口句柄作为一个自变量传给回调。
为了在Java里到达同样的目标,必需利用com.ms.dll包里的Callback类。我们从Callback里担任,并打消callback()。这个要领只能靠近int参数,并会返回int或void。要领签名和详细的实施取决于利用这个回调的Windows API函数。
此刻,我们要举办的全部事情就是建设这个Callback衍生类的一个实例,并将其作为函数指针通报给API函数。随后,J/Direct会辅佐我们自动完成剩余的事情。
下面这个例子挪用了Win32 API函数EnumWindows();EnumWindowsProc类里的callback()要了解获取每个顶级窗口的句柄,获取标题文字,并将其打印到节制台窗口。
 

import com.ms.dll.*;
import com.ms.win32.*;

class EnumWindowsProc extends Callback {
  public boolean callback(int hwnd, int lparam) {
    StringBuffer text = new StringBuffer(50);
    User32.GetWindowText(
      hwnd, text, text.capacity()+1);
    if(text.length() != 0)
      System.out.println(text);
    return true;  // to continue enumeration.
  }
}

public class ShowCallback {
  public static void main(String args[])
  throws InterruptedException {
    boolean ok = User32.EnumWindows(
      new EnumWindowsProc(), 0);
    if(!ok)
      System.err.println("EnumWindows failed.");
    Thread.currentThread().sleep(3000);
  }
}

对sleep()的挪用答允窗口历程在main()退出前完成。

    关键字:

在线提交作业