编写回调函数
有些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()退出前完成。