使用来自user32.dll的SendMessage和java中的jna - 错误

时间:2012-11-22 13:53:56

标签: java winapi jna sendmessage user32

我尝试使用:

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

在Java中使用jna并且我一直收到错误:

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是对的。我的错在哪里?

1 个答案:

答案 0 :(得分:6)

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

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

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

您使用的函数定义类似于ANSI版本,因此您应该使用SendMessageA代替。

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