- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 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;
}
}
所有回调都是静态函数。
最佳答案
我也一直在与这个问题作斗争,并且刚刚找到了一个真正有意义的解决方案。我最终不得不构建 WindowsAccessBridge.dll 的调试版本,并使用调试器进入它以观察发生了什么。
在“initializeAccessBridge”中,它(最终)创建了一个隐藏的对话窗口(使用 CreateDialog)。创建对话框后,它会执行带有已注册消息的 PostMessage。访问桥的 JavaVM 端响应此消息,并将另一条消息回发到已创建的对话框(它似乎是您的应用程序和 Java VM 之间的“hello”类型握手)。因此,如果您的应用程序没有 Activity 的消息泵,则您的应用程序永远不会收到来自 JavaVM 的返回消息。
这很重要,因为在收到此消息之前,桥永远不会正确初始化,因此所有对“IsJavaWindow”的调用都会失败(在内部,一旦收到消息,桥就会初始化一个内部结构——因此,没有 Activity 的消息泵,没有初始化)。我猜这就是为什么您也永远不会收到回调消息的原因。
不仅如此,您还必须在消息泵可以处理消息的位置调用 initializeAccessBridge,然后才能调用 IsJavaWindow。
这就是 JavaFerret 和 JavaMonkey 工作的原因——它们在启动时初始化,然后在桥通过消息泵接收到初始化消息之后枚举对菜单消息的响应。
我能够在我的 MFC 对话框应用程序(以及我们基于 MFC 的应用程序)中解决这个问题的方法是确保您在某个点调用“initializeAccessBridge”,以便内置 MFC 消息泵可以推送在使用它之前,将“你好”消息返回到这个隐藏的对话框。在简单的 MFC 对话框情况下,这意味着调用 OnInitDialog 中的 initializeAccessBridge,并调用枚举过程以响应按钮调用(例如)。如果您希望枚举在对话框出现时立即发生,您可以使用计时器在 OnInitDialog 完成后触发(例如 10 毫秒)以允许处理初始化消息。
如果您打算在控制台应用程序中使用它,您将需要编写自己的自定义消息泵来处理初始化消息。
无论如何,我希望这已经足够清楚了!虽然没有办法知道这是否是“正确”的方法(除了花钱请 Sun 工程师告诉我们),但它确实解决了我的问题。
干杯——达伦。
哦。顺便说一句,我发现了一个不起眼的 Sun 页面,其中提到了一些关于 AccessBridge 仅适用于基于 awt 的 java 应用程序的内容(但鉴于 Sun 自 2004 年以来没有更新任何文档,这可能已经改变)。我不是 Java 程序员——为了测试,我获取了一些免费的 Java 应用程序(以及 jdk 附带的应用程序)并试用了我的测试应用程序。它适用于所有我尝试过的——YMMV。祝你好运!
关于java - 未收到来自 Java Access Bridge 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1161142/
我正在尝试编写 Access Access 数据库的脚本,以便在命令行上使用。 Access 数据库使用工作组文件进行保护。 Dim oApp, sWGF,myWS Set sApp = Create
我有一个包含数据表的表格。我希望用户能够选择多行,单击按钮并运行一些 sql 查询并对这些行执行一些工作。 查看我的 VBA 代码,我发现如何使用 CurrentRecord 属性 Access 最后
如果我在某个网络位置有 Microsoft Access 2007 数据库,那么可以使用该数据库的客户端计算机的数量是否有限制?客户端不会安装 Access,而是使用 Access Runtime 2
我正在开发一个注册系统。但我收到此错误:You tried to execute a query that does not include the specified expression.. 我正
我有一个产品设计为使用 MS Access 文件作为数据库的桌面产品。 现在,一些用户需要将它安装在几台 PC(比如说 2 或 3 台)上并共享数据库。 我想将 MS Access 文件放在共享文件夹
我接手了一个旧的软件项目,该项目使用 MS Access 数据库来存储数据。但是数据库不会在 Access 中打开,如下所示: "You do not have the necessary permi
我有一个文件夹,里面装满了 100 多个 Access97 文件。我需要将它们全部更新到 Access2003。 我可以手动完成,但使用 VBA 可能会快很多。 有没有人会有一个片段可以做到这一点?或
我正在通过 SQL Server 迁移助手 (SSMA) 将数据从 Access 数据库迁移到 SQL Server。 Access 应用程序将继续与转换为链接表的本地表一起使用。 一个连续的表单在加
我正在通过 SQL Server 迁移助手 (SSMA) 将数据从 Access 数据库迁移到 SQL Server。 Access 应用程序将继续与转换为链接表的本地表一起使用。 一个连续的表单在加
我的公司用 Visual Basic 6 开发了一个应用程序。 该应用程序通过 ODBC 数据源使用 Access 数据库。 Access 数据库是一个扩展名为“.mdb”的文件。 在以下环境中运行应
我一直在尝试让 Microsoft Access 从主 Access 窗口中“退出”,以便我可以隐藏 Access 窗口并仅在桌面上显示表单,以便可以轻松地将其放置在其他应用程序旁边。 起初我发现了一
我想在 access 2010 中使用 access 2000 和 2003 数据库。由于我不想检查一切是否手动工作,我正在寻找一种工具来分析 VBA 代码以查找使用 access 2010 发生的错
所以我有一个 Excel 工作簿,其中有一个很好的 shaperange 对象的全局 map 。通过一些非常简单的代码,我可以更改颜色、将国家/地区集合分组和取消分组为数组等......并且效果非常好
我们希望有大约 35-40 人通过共享驱动器上的脚本写入 Access 数据库。这些指标分解为他们需要每小时写大约 3-7 次。 Access 会支持这一点而不会对我产生影响吗? 是的,我很乐意将其用
我正在寻找一种使用 VBA 代码从外部数据库文件中删除 VBA 模块的方法。名为“myfile.accdb”的外部文件有一个名为“mod1”的模块,我希望能够在单独的项目中使用 VBA 代码删除该模块
我在 Access 2003 数据库(在 Access 2007 中开发)中有三个表单,它们处于父级 -> 子级 -> 孙子级关系中。在子窗体的 'Form_Load' 子窗体中,我设置了孙子窗体的一
MS Access 2007 存在拒绝在设计模式下显示表单的问题。我可以看到表单的代码(如果我查看显示表单的按钮的事件属性),但我看不到作为 GUI 布局的表单。而且,当我尝试从应用程序的主窗口调用此
我编写了代码,使用 Excel 中的下拉列表提供的标准将两个表连接起来,然后将数据返回到电子表格上的特定位置(工作表上已经有标题)。 这在我的机器上和其他机器上使用 MS Access 的机器上都可以
我正在开始构建一个应用程序,该应用程序从给定的根路径开始遍历文件夹结构,并将所有找到的 Access 1997 .mdb 文件转换为较新的 Access 2007/2010 .accdb 格式。但是,
我有一个表单和一个按钮。我想通过单击按钮打开另一个表单,并将参数从父表单传递到子表单(子表单的 RecordSource 有参数)。我该怎么做? 最佳答案 您可以通过引用表单的对象来引用调用表单的任何
我是一名优秀的程序员,十分优秀!