- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 Java 为 Windows 编写 OSX Quick-look 替代方案,但在如何在 Activity 资源管理器窗口中获取 Activity 文件选择方面遇到了问题,以下是我的尝试:
@Override
public void nativeKeyReleased(NativeKeyEvent e) {
System.out.println("key up:"
+ NativeKeyEvent.getKeyText(e.getKeyCode()));
if (e.getKeyCode() == NativeKeyEvent.VK_SPACE) {
System.out.println("Space detected! intercept active window");
char[] buffer = new char[MSWindowConstants.MAX_TITLE_LENGTH * 2];
User32DLL.GetWindowTextW(User32DLL.GetForegroundWindow(),
buffer, MSWindowConstants.MAX_TITLE_LENGTH);
System.out.println("Active window title: "
+ Native.toString(buffer));
PointerByReference pointer = new PointerByReference();
User32DLL.GetWindowThreadProcessId(
User32DLL.GetForegroundWindow(), pointer);
Pointer process = Kernel32.OpenProcess(
Kernel32.PROCESS_QUERY_INFORMATION
| Kernel32.PROCESS_VM_READ, false,
pointer.getValue());
Psapi.GetModuleBaseNameW(process, null, buffer,
MSWindowConstants.MAX_TITLE_LENGTH);
System.out.println("Active window process: "
+ Native.toString(buffer));
if(MSWindowConstants.SHELL_PROCESS_NAME.equals(Native.toString(buffer))){
System.out.println("shell focused! intercept selection");
// retrieve selected FileItems and get the path ...
//Ole32.INSTANCE
}
}
MSEnumeration 类:
public class MSEnumeration {
public static class Psapi {
static {
Native.register("psapi");
}
public static native int GetModuleBaseNameW(Pointer hProcess,
Pointer hmodule, char[] lpBaseName, int size);
}
public static class Kernel32 {
static {
Native.register("kernel32");
}
public static int PROCESS_QUERY_INFORMATION = 0x0400;
public static int PROCESS_VM_READ = 0x0010;
public static native int GetLastError();
public static native Pointer OpenProcess(int dwDesiredAccess,
boolean bInheritHandle, Pointer pointer);
}
public static class User32DLL {
static {
Native.register("user32");
}
public static native int GetWindowThreadProcessId(HWND hWnd,
PointerByReference pref);
public static native HWND GetForegroundWindow();
public static native int GetWindowTextW(HWND hWnd, char[] lpString,
int nMaxCount);
}
// public static class Shell32DLL{
// static {
// Native.register("shell32");
// }
//
// public static native Shell32 Windows();
// }
//
// public static class SHDocVwDLL{
// static {
// Native.register("shdocvw");
// }
//
// public static native ShellWindows ShellWindows();
//
// }
}
我对如何在 JNA 中实现以下内容感到困惑:
Get current selection in WindowsExplorer from a C# application?
IntPtr handle = GetForegroundWindow();
List<string> selected = new List<string>();
var shell = new Shell32.Shell();
foreach(SHDocVw.InternetExplorer window in shell.Windows())
{
if (window.HWND == (int)handle)
{
Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
foreach(Shell32.FolderItem item in items)
{
selected.Add(item.Path);
}
}
}
如何将其转换为 JNA 调用?
我查看了 JNA 的 Shell32 类和 COM(Ole32 类),但仍然没有找到任何结果。
我现在能想到的唯一解决方法是将给定的 C# 编译成一个单独的可执行文件,它接受参数并返回文件的路径,但我不太喜欢在 java 中嵌入另一个可执行文件的想法。
编辑:
一些进展:
public static final String CLSID_ShellWindows = "9BA05972-F6A8-11CF-A442-00A0C90A8F39";
public static final String IID_IShellWindows = "85CB6900-4D95-11CF-960C-0080C7F4EE85";
HRESULT hr = Ole32.INSTANCE
.CoCreateInstance(
GUID.fromString(CLSID_ShellWindows),
null,
WTypes.CLSCTX_ALL,
GUID.fromString(IID_IShellWindows),
p);
System.out.println("result:" + W32Errors.SUCCEEDED(hr)
+ "raw:" + hr.toString());
但由于某种原因结果永远不会是真的......
最佳答案
我放弃了 JNA(好吧,为了这个特定任务)并使用了 com4j (用优秀的 documentations )代替。
您首先要为所需的 dll 生成代码,在本例中为 shell32.dll
,使用来自 com4j 的 tlbimp.jar
这个例子可能有点过时了,但我还是把它放在这里
if (isExplorer(getHWNDProcessName(hwnd))) {
IWebBrowser2 browser = getIWebBrowser2(hwnd);
IShellFolderViewDual3 view = getIShellFolderViewDual3(browser);
if (view != null && browser.visible()) {
lastHWND = hwnd;
FolderItems items = view.selectedItems();
ArrayList<Path> paths = new ArrayList<>(items.count());
for (Com4jObject object : items) {
FolderItem item = object.queryInterface(FolderItem.class);
if (item != null) {
paths.add(Paths.get(item.path()));
// this is for example only, do not create a new File just to get length
System.out.println("file: " + item.path() + " length: "
+ new File(item.path()).length() + " type:" + item.type());
}
}
}
}
// some methods used in the example...
public static IWebBrowser2 getIWebBrowser2(HWND hWnd) {
// TODO this can be potentially optimized
IShellWindows windows = ClassFactory.createShell().windows()
.queryInterface(IShellWindows.class);
for (Com4jObject window : windows) {
IWebBrowser2 browser = window.queryInterface(IWebBrowser2.class);
if (browser.hwnd() == getHWNDValue(hWnd))
return browser;
}
return null;
}
public static IShellFolderViewDual3 getIShellFolderViewDual3(IWebBrowser2 browser) {
if (browser == null)
return null;
return browser.document().queryInterface(IShellFolderViewDual3.class);
}
注意:可能缺少一些方法调用,我只发布了有关如何获取所选项目的重要部分。
重要
为此,您需要 Shell32.dll
和 Shdocvw.dll
,因此您要做的是使用不同的 dll 生成两次代码
java -jar tlbimp.jar -o wsh -p test.wsh %WINDIR%\system32\Shell32.dll
java -jar tlbimp.jar -o wsh -p test.wsh %WINDIR%\system32\Shdocvw.dll
这样我们就可以使用 IWebBrowser2
和其他不错的东西,有关您可以使用该类执行的操作的列表,请参阅 docs
关于c# - 使用 JNA 在 Windows 资源管理器中获取选定的文件项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20968920/
我有十二个指向不同类别的链接。作为用户定位的一种方式,我想强调用户现在所在的类别( - 按钮)。 如何在 CSS 中实现这一点?我读到了 selected和 active ,但我还没能让它发挥作用。
我想通过单击按钮来获取选择框中的所有选项值(选定/未选定)。我怎样才能做到这一点? 最佳答案 我认为这是使用 Traversing/map 的好机会方法: var valuesArray = $("#
我正在尝试构建一个计算器,其中包含两个数字的两个 TextView 字段。我弄清楚了如何使用“应用程序内”数字键盘输入顶部数字 Operand 1 [textView] 的数字(我知道使用 EditT
我有一个简单的 jQuery $("span.value"),它选择包含文本的节点。此文本保证为整数。如何计算所有选定节点文本的总和,并将总和放入另一个节点? 3 4 5 ? 最佳答案 你可以这样做:
我从同一台服务器上托管的一堆数据库中备份了 mysql 数据库 db1。现在只需要备份具有访问 db1 权限的选定用户,以便我可以在 db1 还原之前将这些特权用户还原到我的新服务器。 最佳答案 St
我有一个 ListView 。我想添加一个动画,如果我选择一个列表项,它将被删除,并且该项目下方的其余项目将通过向上滑动动画向上移动。我已经通过获取其子位置使用线性布局完成了此操作,但我无法理解如何向
我不明白如何使用 Python 解析来自 Outlook 的突出显示(选定)邮件? 我有这个代码,但它适用于上一封邮件。 import win32com.client outlook = win32c
在 Xcode 6 中,您现在可以为选项卡项目的选中和未选中状态设置图标。请参阅下图中的说明: 和 唯一的问题是 SELECTED 状态的图像不显示。它只是显示空白。还有其他人有这个问题吗?请看下面的
在我的数据模型中,我有一个实体组和另一个GroupMember实体。一个Group包含一个或多个GroupMembers,但一个GroupMember只能同时位于一个Group中。到目前为止没有问题,
Android Button 在不同状态(正常、按下、选中、禁用)之间移动时会更改其可绘制背景。背景切换是即时的。是否可以使其平滑(动画)? 最佳答案 是的,这是可能的。您只需为按钮添加 addAni
我使用 emacs 来查看和编辑代码和其他文本文件。我想知道是否有一种方法可以向前或向后搜索当前缓冲区中标记的文本。类似于我在记事本或写字板中可以执行的操作。就像我可以在缓冲区中标记一些文本并执行 C
如何根据状态(选定、禁用)设置自定义选择类?如何根据状态选择(选定、禁用)在自定义下拉列表中设置类?照做了,但什么也没发生。请看我的例子................................
我正在尝试检查下拉菜单中是否存在特定文本值,如果存在,我想将其属性设置为selected。 我成功编写了一个 if 语句来检查文本是否存在: var country = usr.location; i
对于我的应用程序,我想让用户能够在回收器 View 中调整 TextView 项目的文本大小(通过捏缩放或 SeekBar)。默认值应为系统设置中选择的文本大小。最小值应为系统设置中的“非常小”,最大
我正在尝试创建一个 ListBoxItem 模板,该模板在选择时将带有圆角边框。我得到了这个 xaml,它在选择时不起作用:
我正在寻找检索焦点元素的 HTML。查看 webdriver.io 文档,方法 .getActiveElement() 应该可以解决这个问题。但是,我的 IDE (WebStorm) 显示错误,指出它
我创建了一个圆,在我的 onDraw() 方法中围绕圆绘制了一条字符串和一条线(箭头)。 public class Circle extends Activity { public class
对于生产应用程序,我们希望在 Windows 窗体应用程序的 ElementHost 内显示 DatePicker,但我们遇到了 SelectedDate 和 CurrentDate 不可读的问题,因
好的,我在此处和 Google 上的许多网站上搜索了此问题的结果,但找不到针对我的问题的确切解决方案。 我有一个 sql 提取姓名和办公室。所以事情是这样的: $sql = "SELECT m
选中单元格时如何改变灰色? 最佳答案 当用户点击选中的行 (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSInd
我是一名优秀的程序员,十分优秀!