Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java处理外部窗口_Java_Winapi - Fatal编程技术网

使用java处理外部窗口

使用java处理外部窗口,java,winapi,Java,Winapi,我需要使用标题检查外部窗口(另一个java程序,但不受我正在处理的程序控制)是否打开,如果打开了,则根据java中的用户命令(我只知道窗口的标题,其他什么都不知道)将其最大化或最小化。谷歌只说我可以使用winapi获取窗口句柄并使用句柄对其进行操作,但我找不到如何做到这一点 我可以在这里找到关于如何使用JNI的参考资料: . 不使用JNI就可以做到这一点吗 有人能帮我理解怎么做吗 感谢并问候您可以使用Windows API获取窗口句柄,然后调整其大小: EnumWindows: http://m

我需要使用标题检查外部窗口(另一个java程序,但不受我正在处理的程序控制)是否打开,如果打开了,则根据java中的用户命令(我只知道窗口的标题,其他什么都不知道)将其最大化或最小化。谷歌只说我可以使用
winapi
获取窗口句柄并使用句柄对其进行操作,但我找不到如何做到这一点

我可以在这里找到关于如何使用JNI的参考资料: . 不使用JNI就可以做到这一点吗

有人能帮我理解怎么做吗


感谢并问候

您可以使用Windows API获取窗口句柄,然后调整其大小:

EnumWindows:
http://msdn.microsoft.com/en-us/library/ms633497%28v=VS.85%29.aspx

GetNextWindow:
http://msdn.microsoft.com/en-us/library/ms633509%28v=VS.85%29.aspx

GetWindowText:   (to decide whether that is the window you want; if title matches)
http://msdn.microsoft.com/en-us/library/ms633520%28v=VS.85%29.aspx

FindWindow:  (for this you need the exact title beforehand, not just part of it)
http://msdn.microsoft.com/en-us/library/ms633499%28v=vs.85%29.aspx

ShowWindow:
http://msdn.microsoft.com/en-us/library/ms633548%28v=VS.85%29.aspx

典型的WinAPI接口,使用起来有点笨重,但功能强大。

Java没有用于此的API,因此您必须使用JNI。有关详细信息,请参见eznme的答案。

如前所述,这在纯Java中是不可能的。本机实现的示例(您需要将其转换为JNI):

您已经有了窗口名,但还应该提供类名,因为这样可以更准确地获取窗口。如果有多个窗口具有相同的窗口名,那么您的程序可能会执行一些不需要的操作

您可以使用Spy++之类的工具来获取类名。或者也可以简单地通过代码。确保您的窗口是当前唯一具有匹配windowname的窗口,然后您可以执行以下操作:

TCHAR lpClassName[256] = {0};

HWND hwnd = FindWindow( _T("classname"), _T("windowname") );
GetClassName( hwnd, lpClassName, _countof( lpClassName ) );
MessageBox( NULL, _T("Class Name"), lpClassName, MB_OK );

如果可以通过代码从Java进程本身获取HWND,那么您应该将其传递到本机部分,因为它将保证可靠。

我刚刚在其中添加了许多与win32相关的窗口函数。你可以看到细节

您还可以枚举所有窗口:

final WinDef.HWND[] windowHandle = new WinDef.HWND[1];
User32.INSTANCE.EnumWindows(new WinUser.WNDENUMPROC() {
    @Override
    public boolean callback(WinDef.HWND hwnd, Pointer pointer) {
        if (matches(hwnd)) {
            windowHandle[0] = hwnd;
            return false;
        }
        return true;
    }
}, Pointer.NULL);

// Minimize or maximize windowHandle[0] here...

+1没有JNI是不可能的,所以他要么使用JNI,要么就不能这样做。无论是哪种方式,当存在FindWidow API时,这种方法都是多余的。这与winapi无关,但Linux或MacOS是否也有相同的可能性?以下是一些在Linux下如何做到这一点的建议:听起来在Mac上可能不可能:
// Find and minimize a window:
WinDef.HWND hWnd = User32.INSTANCE.FindWindow("className", "windowName");
User32.INSTANCE.ShowWindow(hWnd, WinUser.SW_MINIMIZE);
final WinDef.HWND[] windowHandle = new WinDef.HWND[1];
User32.INSTANCE.EnumWindows(new WinUser.WNDENUMPROC() {
    @Override
    public boolean callback(WinDef.HWND hwnd, Pointer pointer) {
        if (matches(hwnd)) {
            windowHandle[0] = hwnd;
            return false;
        }
        return true;
    }
}, Pointer.NULL);

// Minimize or maximize windowHandle[0] here...