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;
}
}
すべてのコールバックは静的関数です。