代码之家  ›  专栏  ›  技术社区  ›  James

未从Java访问桥接收回调

  •  7
  • James  · 技术社区  · 16 年前

    我在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;
       }
    }
    

    所有回调都是静态函数。

    2 回复  |  直到 8 年前
        1
  •  9
  •   Darren Ford    16 年前

    我也一直在努力解决这个问题,刚刚找到了一个真正有意义的解决方案。我最终不得不构建WindowsAccessBridge.dll的调试版本,并使用调试器介入其中以观察发生了什么。

    我能够在我的MFC对话框应用程序(以及我们基于MFC的应用程序)中解决这个问题的方法是,确保你在某个点调用“initializeAccessBridge”,这样内置的MFC消息泵就可以在你使用它之前将“hello”消息推回到这个隐藏的对话框中。在简单的MFC对话框中,这意味着在OnInitDialog中调用initializeAccessBridge,并在响应按钮调用时调用枚举过程(例如)。如果希望枚举在对话框出现后立即出现,可以在OnInitDialog完成后使用计时器触发(例如10ms),以允许处理初始化消息。

    干杯,达伦。

        2
  •  0
  •   David Rabinowitz    16 年前

    您确定OnJavaShutdown()是静态的吗?我认为宣言应该是

    static oid JavaAccess::OnJavaShutdown( long vmID )