1

我尝试使用:

LRESULT WINAPI SendMessage(_In_  HWND hWnd, _In_  UINT Msg,
                           _In_  WPARAM wParam, _In_  LPARAM lParam);

在带有 jna 的 Java 中,我不断收到错误消息:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Error looking up function 'SendMessage'

这是我的界面:

public interface User32 extends StdCallLibrary {
Pointer GetForegroundWindow();
int SendMessage(Pointer hWnd, int msg, int num1, int num2);

我这样称呼它:

Pointer hW = user32.GetForegroundWindow();
user32.SendMessage(hW, 0x0201, 0, 0);
user32.SendMessage(hW, 0x0202, 0, 0);

hWnd 是对的。我的错误在哪里?

4

1 回答 1

7

JNA 在 user32.dll 中找不到函数“SendMessage”,因为没有导出该名称的函数。

这是因为 SendMessage 是一个旧名称,它被其他编译器自动映射到匹配的 ANSI 或 UNICODE 版本的函数 -SendMessageASendMessageW.

使用显示 DLL 导出函数的工具,例如 DependencyWalker,您可以看到 Windows 7 的 user32.dll 仅知道这两个函数SendMessageASendMessageW但不知道SendMessage.

您使用的函数定义看起来像 ANSI 版本,因此您应该SendMessageA改用。

顺便提一句。如果您使用 32 位或 64 位 Java 和 user32.dll,则没有任何区别。我写的对两个版本都是正确的。

于 2012-11-22T14:08:43.853 回答