2013-10-24 21 views
5

Haskell ile tuş vuruşlarını simüle etme Windows üzerinde tuş vuruşlarını simüle eden bir Haskell programı yazmaya çalışıyorum. Keybd_event ve SendInput'u aramayı denedim, ancak ikisi de derlenmedi. Yine de programı tercümanla yönetebilirim.Windows

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 

ayrıntılı hata http://pastebin.com/trg21N0x olan, ancak herhangi bir daha fazla ipucu içeriyor gibi görünmüyor: Bunun bir winable.h içinde SendInput bağlanarak içerdiğinde program oluşturmaya çalıştığımda, hata alıyorum. keybd_event'u kullanmaya çalıştığımda benzer bir hata alıyorum. yazdım hsc dosyası bu başlıkları içerir:

İşte
#include "windows.h" 
#include "winuser.h" 
#include "winable.h" 

C bağlayıcı:

foreign import ccall unsafe "winable.h SendInput" 
     c_SendInput :: UINT 
        -> Ptr Input 
        -> CInt 
        -> IO UINT 
ben çünkü #if ait winuser.h üzerinde SendInput çağrı olamazdı varsayılır

:

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

_WIN32_WINNT için bir bağlayıcı eklediğimde, değer 0x400'dür.

Haskell Platformunun 2012.4.0.0 versiyonunu kullanıyorum. Dahil ettiğimleri içeren bir başlık klasörüyle geldi. Bilgisayarımda aynı ada sahip başka bir başlık bulamadım. Windows 7 Professional, 6.1 sürümünü kullanıyorum.

Teşekkür ederiz! Ben klavye işlevlerine bağlantıları dışarı yorum yaparken

-- 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 

Oluşturma başarılı: Burada

WindowsKeys.cabal olduğunu.

+0

Bazı kitaplığa bağlamaya çalışıyor musunuz? Eğer öyleyse, hangi kütüphane ve GHC'ye onu nerede bulacağına nasıl söylüyorsunuz? * .cabal'da ne var? –

+0

Windows'daki user32 kitaplığına bağlamaya çalışıyorum. Sorumu .cabal dosyasıyla güncelledim. – user2917747

cevap

1

Sonunda yanlış çağrı kuralı kullandığımı öğrendim. keybd_event ve SendInput'un her ikisi de ccall yerine stdcall ile çağrılmalıdır.