- 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/
我的 ADT(Android 开发人员工具)工作正常,几天前它显示所有文件的图形布局,但今天它显示“无法加载 LayoutLib:com.android.layoutlib.bridge.Bridge
我正在尝试使用以下命令控制是否将通过我在 Docker 容器中设置的网桥的数据包发送到 iptables 进行处理: sysctl -w net.bridge.bridge-nf-call-ipt
我正在努力创建自己的自定义组件,以便与蓝牙设备进行交互。 I tried this in Swift , 但由于访问桥的问题而没有到达任何地方。 我在 Objective-C 中重新实现它并遇到了同样
是否有任何方法可以确定或任何资源可以找到 Haswell、Sandy Bridge、Ivy Bridge 和 Skylake Intel 处理器的分支目标缓冲区大小? 最佳答案 检查 Agner Fo
有什么解决办法吗? Error starting daemon: Error initializing network controller: could not delete the default
在 WSL2 中运行 docker info(在 ArchWSL 和 Ubuntu 20.04 上)我收到以下警告: WARNING: bridge-nf-call-iptables is disab
我正在使用 ansible 设置 kubernetes 集群。尝试启用内核 IP 路由时出现以下错误: Failed to reload sysctl: sysctl: cannot stat /pr
停止 docker 后,它拒绝重新启动。它提示另一个名为 docker0 的网桥已经存在: level=warning msg="devmapper: Base device already exis
我将这些文件从 Finder 直接添加到我的项目中,然后添加到 Xcode。 桥接 header 由 Xcode 自动创建。 #import 将类导入桥接 header - 桥接 header 没有问
我按照 Google Sign-in for iOS 上的所有说明进行操作使用CocoaPods(尽管我以前没有使用过CocoaPods,但仍然不明白它是什么),当我运行程序时,我收到此错误: bri
概述 桥接模式一种结构型模式,它主要应对的是:由于实际的需要,某个类具有两个或以上的维度变化,如果只是用继承将无法实现这种需要,或者使得设计变得相当臃肿。 桥接模式的做法是把变化的部分抽象出来,使
Android webView 不支持 Google oAuth。 Google 建议使用 chrome 自定义标签进行 oAuth。我也有从我的网络应用程序到 native 的 js 调用的要求。如
我正在从事一个网络项目,出于某种原因,我需要修改 Linux 中使用的网桥的源代码。我想知道如何添加 http://lxr.free-electrons.com/source/net/bridge/源
Docker 似乎在容器开始运行后创建了一个桥,然后与我的主机网络发生冲突。这不是默认的桥 docker0,而是在容器启动后创建的另一个桥。我可以根据较旧的用户指南链接 https://docs.do
桥接模式属于先天模式,这里的先天模式就是说一开始就要把结构搭建好,方便后来的扩展,而不是对已经出现的模块和接口进行改进扩展的。桥接的核心在于实体类和操作类之间的聚合关系,这个聚合关系就是我们所说的&
1、桥梁模式结构图 2、桥梁模式中主要角色 抽象化(Abstraction)角色:定义抽象类的接口并保存一个对实现化对象的引用。 修正抽象化(Refined Abstractio
代码如下: <?php /** * 桥接模式 * * 将抽象部份与它实现部分分离,使用它们都可以有独立的变化 */
题目地址:https://leetcode.com/problems/shortest-bridge/description/ 题目描述 Ina given 2D binary array A,
桥接模式(Bridge Pattern)是用于把抽象化与实现化解耦,使得二者可以独立变化 桥接模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响
LocalAppData为由 Desktop App Converter 转换的应用程序虚拟化. 例如。 “真实”LocalAppData地点是: C:\Users\user\AppData\Loca
我是一名优秀的程序员,十分优秀!