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