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

Dom*_*nik 1 java winapi user32 jna sendmessage

我尝试使用:

LRESULT WINAPI SendMessage(_In_  HWND hWnd, _In_  UINT Msg,
                           _In_  WPARAM wParam, _In_  LPARAM lParam);
Run Code Online (Sandbox Code Playgroud)

在Java中使用jna并且我不断收到错误:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Error looking up function 'SendMessage'
Run Code Online (Sandbox Code Playgroud)

这是我的界面:

public interface User32 extends StdCallLibrary {
Pointer GetForegroundWindow();
int SendMessage(Pointer hWnd, int msg, int num1, int num2);
Run Code Online (Sandbox Code Playgroud)

我称之为:

Pointer hW = user32.GetForegroundWindow();
user32.SendMessage(hW, 0x0201, 0, 0);
user32.SendMessage(hW, 0x0202, 0, 0);
Run Code Online (Sandbox Code Playgroud)

hWnd是对的.我的错在哪里?

Rob*_*ert 7

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

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

使用的工具,显示像DependencyWalker一个DLL导出的函数,你可以看到的Windows 7是user32.dll中例如只知道这两个函数SendMessageASendMessageW,但没有SendMessage.

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

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