Java JNA FindWindow() - 查找函数“FindWindow”时出错:找不到指定的过程

Posted

技术标签:

【中文标题】Java JNA FindWindow() - 查找函数“FindWindow”时出错:找不到指定的过程【英文标题】:Java JNA FindWindow() - Error looking up function 'FindWindow': The specified procedure could not be found 【发布时间】:2014-03-24 14:24:06 【问题描述】:

我正在尝试使用JNA 将名为MyWindowTitle 的窗口置于前面。

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.platform.win32.WinDef.HWND;

public class ToFront 

public static interface User32 extends StdCallLibrary 
    final User32 instance = (User32) Native.loadLibrary ("user32", User32.class);
    HWND FindWindow(String winClass, String title); 
    boolean ShowWindow(HWND hWnd, int nCmdShow);
    boolean SetForegroundWindow(HWND hWnd);




public static void main(String[] args) 
    HWND hwnd = User32.instance.FindWindow(null, "MyWindowTitle"); 
    User32.instance.ShowWindow(hwnd, 9); 
    User32.instance.SetForegroundWindow(hwnd); 



我收到以下异常java.lang.UnsatisfiedLinkError: Error looking up function 'FindWindow': The specified procedure could not be found.

【问题讨论】:

JNA 附带标准窗口函数的定义。看看com.sun.jna.platform.win32.User32。您可以使用他们的定义,或者如果您更喜欢使用自己的定义,您可以查看您的设置与他们的设置有何不同。 【参考方案1】:

检查函数的拼写。您可以使用dependency walker 来查看该函数是否存在于您的dll 中。

Ps : 当我打开 user32.dll 时,这些是我发现的函数

:FindWindowA,FindWindowExA,FindWindowExW,FindWindowW 

【讨论】:

【参考方案2】:

您可以使用以下调用 FindWindowEx 的代码。注意FindFidow不会根据这篇文章搜索子窗口http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx

import com.sun.jna.Native;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.win32.StdCallLibrary;

public class SomeClass 

    public static interface User32 extends StdCallLibrary
    
         final User32 instance = (User32) Native.loadLibrary ("user32", User32.class);
         HWND FindWindowExA(HWND hwndParent, HWND childAfter, String className, String windowName);
         HWND FindWindowA(String className, String windowName);
    

    public static void main(String[] args)
    
        HWND hwndShell = User32.instance.FindWindowExA(null, null, "Shell_TrayWnd", null);
        HWND hWnd = User32.instance.FindWindowExA(hwndShell, null, "Start", "Start");     
    

【讨论】:

以上是关于Java JNA FindWindow() - 查找函数“FindWindow”时出错:找不到指定的过程的主要内容,如果未能解决你的问题,请参考以下文章

全网首发:There is an incompatible JNA native library installed on this system/6.1.2/4.0.1

全网首发:There is an incompatible JNA native library installed on this system/6.1.2/4.0.1

使用JNA,让java调用原生代码

java使用JNA框架调用dll动态库

Java中jna的用法

调用使用 Java + JNA 的 WinInet 函数