2012-11-22 223 views
1

我嘗試使用:在Java中使用SendMessage函數從user32.dll中在Java JNA - 錯誤

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

與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是正確的。我的錯誤在哪裏?

+0

您使用的是Java 32位還是64位版本? – Robert

+0

我想我已經安裝了 - 我該如何檢查? – Dominik

+0

你如何運行該程序? – Robert

回答

6

JNA在user32.dll中找不到函數「SendMessage」,因爲沒有導出該名稱的函數。

這是因爲SendMessage是一箇舊名稱,它由其他編譯器自動映射到函數的匹配ANSI或UNICODE版本 - SendMessageASendMessageW

使用顯示DLL的導出函數(如DependencyWalker)的工具,可以看到Windows 7的user32.dll例如只知道函數SendMessageASendMessageW,但不知道SendMessage

您使用的函數定義看起來像ANSI版本,因此您應該使用SendMessageA來代替。

順便說一句。如果您使用32位或64位Java和user32.dll,它沒有任何區別。我寫的兩個版本都是正確的。

+0

啊謝謝!!它的工作原理...但它總是點擊0,0我認爲位置是用lParam值發送的。什麼是正確的格式? – Dominik

+0

0x0201是WM_LBUTTONDOWN因此你可以在這裏找到文檔:http://msdn.microsoft.com/en-us/library/windows/desktop/ms645607(v=vs.85).aspx – Robert

+0

不,我的意思是點擊的位置 - 你可以看到我已經有了'clickevent'的正確值 – Dominik