2013-10-24 82 views
5

我正在嘗試編寫一個模擬Windows上的按鍵的Haskell程序。我試圖調用keybd_event和SendInput,但都沒有編譯。不過,我可以和解釋器一起運行程序。當我嘗試它包含一個winable.h結合SendInput時籌建方案,我得到的錯誤:在Windows上模擬與Haskell的按鍵

cabal install 
... 
[1 of 2] Compiling WindowsKeys  (dist\build\WindowsKeys\WindowsKeys-tmp\WindowsKeys.hs, dist\build\WindowsKeys\WindowsKeys-tmp\WindowsKeys.o) 
[2 of 2] Compiling Main    (src\Main.hs, dist\build\WindowsKeys\WindowsKeys-tmp\Main.o) 
Linking dist\build\WindowsKeys\WindowsKeys.exe ... 
dist\build\WindowsKeys\WindowsKeys-tmp\WindowsKeys.o:fake:(.text+0x35d): undefined reference to `SendInput' 
collect2: ld returned 1 exit status 
cabal: Error: some packages failed to install: 
WindowsKeys-0.1.0.0 failed during the building phase. The exception was: 
ExitFailure 1 

的詳細的錯誤是在http://pastebin.com/trg21N0x,但它似乎並沒有包含任何更多的線索。當我嘗試使用keybd_event時,出現類似錯誤。 我寫的HSC文件包括這些標題:

#include "windows.h" 
#include "winuser.h" 
#include "winable.h" 

這裏是C語言綁定:

foreign import ccall unsafe "winable.h SendInput" 
     c_SendInput :: UINT 
        -> Ptr Input 
        -> CInt 
        -> IO UINT 

我認爲我不能在WINUSER.H調用SendInput因爲在#if的:

#if (_WIN32_WINNT >= 0x0403) 
WINUSERAPI UINT WINAPI SendInput(UINT,LPINPUT,int); 

當我添加用於_WIN32_WINNT的結合,則該值爲0×400。

我有Haskell平臺版本2012.4.0.0。它帶有一個包含我包含的頭文件的文件夾。我無法在計算機上找到其他名稱相同的其他標頭。我正在使用Windows 7 Professional,版本6.1。

謝謝!

這裏是WindowsKeys.cabal:當我註釋掉綁定到鍵盤功能

-- Initial WindowsKeys.cabal generated by cabal init. For further 
-- documentation, see http://haskell.org/cabal/users-guide/ 

name:    WindowsKeys 
version:    0.1.0.0 
build-type:   Simple 
cabal-version:  >=1.8 
extra-source-files: windows.h, winuser.h, winable.h 

executable WindowsKeys 
    main-is:    Main.hs 
    other-modules:  WindowsKeys 
    build-depends:  base ==4.5.*, Win32 ==2.2.* 
    hs-source-dirs:  src 
    build-tools:   hsc2hs 
    extra-libraries:  user32 
    include-dirs:  src 

構建成功。

+0

你想綁定到一些庫嗎?如果是這樣,什麼庫,以及你如何告訴GHC在哪裏找到它? '* .cabal'中有什麼? –

+0

我想綁定到Windows上的user32庫。我用.cabal文件更新了我的問題。 – user2917747

回答

1

我終於發現我使用了錯誤的調用約定。 keybd_eventSendInput都需要用stdcall而不是ccall來調用。