我正在尝试使用 Java Access Bridge 从 C++ 应用程序中获取有关 Swing 组件的信息。但是,我注册的回调都没有被调用。我尝试枚举窗口,然后在每个句柄上调用 IsJavaWindow(),但它总是返回 false。关于为什么它显然不起作用的任何想法?
我认为这是我的应用程序而不是网桥安装的问题,因为演示 Monkey 和 Ferret 程序可以工作,initializeAccessBridge() 返回 true,并且调试器显示 WindowsAccessBridge dll 已加载。
我在 Windows Vista 上使用 Java 6,更新 13,我认为访问桥的版本为 2.0.1。
JavaAccess::JavaAccess(void)
{
using namespace std;
BOOL isInitialized = initializeAccessBridge();
if(isInitialized)
{
cout << "Bridge Initialized!" << endl;
}
else
{
cout << "Initialization failed!" << endl;
return;
}
EnumWindows((WNDENUMPROC)EnumWndProc, NULL);
SetJavaShutdown(OnJavaShutdown);
SetFocusGained(OnFocusGained);
SetMouseClicked(OnMouseClicked);
}
JavaAccess::~JavaAccess(void)
{
shutdownAccessBridge();
}
void JavaAccess::OnJavaShutdown( long vmID )
{
using namespace std;
cout << "Java shutdown!" << endl;
}
void JavaAccess::OnFocusGained( long vmID, FocusEvent event, AccessibleContext context )
{
using namespace std;
cout << "Focus Gained!" << endl;
ReleaseJavaObject(vmID, event);
ReleaseJavaObject(vmID, context);
}
void JavaAccess::OnMouseClicked( long vmID, jobject event, jobject source )
{
std::cout << "Mouse clicked!" << std::endl;
ReleaseJavaObject(vmID, event);
ReleaseJavaObject(vmID, source);
}
BOOL CALLBACK JavaAccess::EnumWndProc( HWND hwnd, LPARAM lparam )
{
if (IsJavaWindow(hwnd))
{
std::cout << "Found Java Window!" << std::endl;
return FALSE;
}
else
{
std::cout << "Still looking" << std::endl;
return TRUE;
}
}
所有回调都是静态函数。