Tôi đang cố gắng sử dụng Java Access Bridge để nhận thông tin về các thành phần Swing từ bên trong ứng dụng C++. Tuy nhiên, không ai trong số các callbacks tôi đăng ký bao giờ được gọi. Tôi đã thử enuming các cửa sổ một sau đó gọi IsJavaWindow() trên mỗi xử lý, nhưng nó luôn luôn trả về false. Bất kỳ ý tưởng về lý do tại sao nó dường như không hoạt động?Không nhận được cuộc gọi lại từ cầu truy cập Java
Tôi cho rằng đó là sự cố với ứng dụng của tôi thay vì cài đặt cầu vì chương trình demo và chương trình Ferret hoạt động, initializeAccessBridge() trả về true và trình gỡ lỗi cho biết rằng tệp WindowsAccessBridge được tải.
Tôi đang sử dụng Java 6, bản cập nhật 13 trên Windows Vista và tôi nghĩ phiên bản 2.0.1 của cầu truy cập.
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;
}
}
Tất cả các cuộc gọi lại là các hàm tĩnh.
Tôi đã bắt đầu nghi ngờ rằng nó yêu cầu một máy bơm tin nhắn, và tôi thích lời giải thích của bạn tại sao. Tôi vừa sửa đổi thử nghiệm của tôi và nó hoạt động ngay bây giờ. Đây là một số điểm thưởng! – James
Cảm ơn điểm trên vòng lặp tin nhắn. Re: giao diện điều khiển ứng dụng. Trong C# Bạn có thể sử dụng [Application.Run()] (https://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx) với no-args để tạo ra một chính đơn giản vòng lặp tin nhắn. Nếu bạn muốn thực hiện bất kỳ cuộc gọi đến dll thì làm như vậy từ một chủ đề khác. Đối với C++, [Tải xuống Java Access Bridge] (http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136191.html) chứa mã nguồn JavaMonkey.cpp có GetMessage chuẩn, TranslateMessage , DispatchMessage loop. – Daniel