在Java
1.4中,您可以使用(((SunToolkit)Toolkit.getDefaultToolkit())。getNativeWindowHandleFromComponent(),但这已被删除。
看来您现在必须使用JNI来执行此操作。您是否有JNI代码和示例Java代码来执行此操作?
我需要它来调用Win32 GetWindowLong和SetWindowLong API调用,这可以通过Jawin库完成。
我想要非常精确的内容,因此可以将引用传递给JDialog或JFrame并获取窗口句柄。
以下代码使您可以传递Component以获得其窗口句柄(HWND)。要确保Component具有相应的窗口句柄,请在Component上调用isLightWeight()并验证其等于false。如果不是,请通过调用Component.getParent()尝试将其作为父项。
Java代码:
package win32;
public class Win32 {
public static native int getWindowHandle(Component c);
}
头文件main.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class win32_Win32 */
#ifndef _Included_win32_Win32
#define _Included_win32_Win32
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: win32_Win32
* Method: getWindowHandle
* Signature: (Ljava/awt/Component;Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_win32_Win32_getWindowHandle
(JNIEnv *, jclass, jobject);
#ifdef __cplusplus
}
#endif
#endif
C语言源main.c:
#include<windows.h>
#include <jni.h>
#include <jawt.h>
#include <jawt_md.h>
HMODULE _hAWT = 0;
JNIEXPORT jint JNICALL Java_win32_Win32_getWindowHandle
(JNIEnv * env, jclass cls, jobject comp)
{
HWND hWnd = 0;
typedef jboolean (JNICALL *PJAWT_GETAWT)(JNIEnv*, JAWT*);
JAWT awt;
JAWT_DrawingSurface* ds;
JAWT_DrawingSurfaceInfo* dsi;
JAWT_Win32DrawingSurfaceInfo* dsi_win;
jboolean result;
jint lock;
//Load AWT Library
if(!_hAWT)
//for Java 1.4
_hAWT = LoadLibrary("jawt.dll");
if(!_hAWT)
//for Java 1.3
_hAWT = LoadLibrary("awt.dll");
if(_hAWT)
{
PJAWT_GETAWT JAWT_GetAWT = (PJAWT_GETAWT)GetProcAddress(_hAWT, "_JAWT_GetAWT@8");
if(JAWT_GetAWT)
{
awt.version = JAWT_VERSION_1_4; // Init here with JAWT_VERSION_1_3 or JAWT_VERSION_1_4
//Get AWT API Interface
result = JAWT_GetAWT(env, &awt);
if(result != JNI_FALSE)
{
ds = awt.GetDrawingSurface(env, comp);
if(ds != NULL)
{
lock = ds->Lock(ds);
if((lock & JAWT_LOCK_ERROR) == 0)
{
dsi = ds->GetDrawingSurfaceInfo(ds);
if(dsi)
{
dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
if(dsi_win)
{
hWnd = dsi_win->hwnd;
}
else {
hWnd = (HWND) -1;
}
ds->FreeDrawingSurfaceInfo(dsi);
}
else {
hWnd = (HWND) -2;
}
ds->Unlock(ds);
}
else {
hWnd = (HWND) -3;
}
awt.FreeDrawingSurface(ds);
}
else {
hWnd = (HWND) -4;
}
}
else {
hWnd = (HWND) -5;
}
}
else {
hWnd = (HWND) -6;
}
}
else {
hWnd = (HWND) -7;
}
return (jint)hWnd;
}
问题内容: 我正在尝试在JPanel中嵌入HWND(窗口句柄)。 实际上,我可以将HWND嵌入到JFrame中,但是嵌入式窗口始终位于其他组件的顶部,因此无法移动它。如果尝试删除我的JFrame的所有子组件,则HWND将保留在那里。HWND似乎是在JFrame顶部绘制的,而不是其中之一。 要将HWND嵌入到JPanel中,我通过jna使用User32: 我用它来获取我的JFrame的HWND: 有
问题内容: 我们正在Windows中构建JavaFX应用程序,我们希望能够做一些事情来操纵我们的应用程序在Windows 7/8任务栏中的显示方式。这需要修改Windows变量,称为“ 应用程序用户模型ID ”。 我们已经通过使用JNA设法完全完成了我们在Swing中想要的工作,并且我们想在JavaFX中重复我们的解决方案。不幸的是,要做到这一点,我们需要能够为应用程序中的每个窗口检索(窗口句柄)
问题内容: 我正在开发python应用程序,我想获取每个打开的窗口。我需要窗口的名称和来过滤列表,以管理一些特定的窗口,移动它们并调整其大小。 我试图自己查看信息,但没有获得正确的代码。我尝试使用此代码,但仅获得每个窗口的标题(很棒),但我也需要。 这里有一个错误: 问题答案: 你混了和。 在你所得到的是通过获得,是一个对象。这就是为什么不接受它。你应该把它传给 如果要使用,则可以直接使用pyth
使用Inspect.exe我可以看到应用程序组件的树结构中存在一个按钮,但我找不到获取该按钮句柄的方法。这是控件的Inspect.exe输出: 这个按钮的特殊之处在于它没有hwnd值。(hwnd: 0x0)。这是我试图获得对该按钮的引用的内容: 在本例中,hwnd变量是包含按钮的应用程序主窗口的句柄。 在阅读FindWindowEx的留档时,看起来似乎有多种方法可以使用不同的参数,我觉得我已经尝试
问题内容: 当我单击页面上的按钮(在IE浏览器中)时,将打开一个新的弹出页面。我尝试获取此弹出窗口的窗口句柄失败。这是我的第一次尝试: 此尝试仅打印基本窗口的句柄,并且如果第二个print语句放置在if()语句之外,但在while()语句内以及if()语句之后,则仅输出基本窗口的标题。因此,这组句柄似乎只包含基本窗口句柄。 这是我的第二次尝试: 尝试返回一个错误,该错误表明数组popUpWin为空
问题内容: 我是JNA的新手。我试图获取所有窗口的句柄,包括最小化的窗口。我需要所有的窗户。我遇到了Windows问题:如何获取所有可见窗口的列表?这帮助我获得了Windows列表,但是它的类型为int。我不能与要求type的函数一起使用。那么,有什么方法可以获取类型而不是int指针的所有窗口句柄?最后,为什么和?它如何接受两者?我有点困惑。谢谢。 我有以下代码(从Hovercreft的答案中编辑