2013-10-24 2 views
5

Я пытаюсь написать программу Haskell, которая имитирует нажатия клавиш на Windows. Я попытался вызвать keybd_event и SendInput, но ни один не скомпилирован. Однако я могу запустить программу с помощью интерпретатора. Когда я пытаюсь построить программу, если она содержит привязку к SendInput в winable.h, я получаю ошибку:Моделирование нажатий клавиш с помощью Haskell на 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 

многословная ошибки в http://pastebin.com/trg21N0x, но это, кажется, не содержит какие-либо больше ключей. Я получаю аналогичную ошибку, когда пытаюсь использовать keybd_event. СГГ файл я написал включает в себя следующие заголовки:

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

Вот С обязательным:

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

Я предположил, что я не мог назвать SendInput на winuser.h из-за #if:

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

Когда я добавляю привязку для _WIN32_WINNT, значение равно 0x400.

У меня есть версия 2012.4.0.0 платформы Haskell. Он поставляется с папкой заголовков, содержащей те, которые я включил. Я не мог найти никаких других заголовков с одинаковыми именами на моем компьютере. Я использую 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

Я пытаюсь связать с библиотекой user32 в Windows. Я обновил свой вопрос в файле .cabal. – user2917747

ответ

1

Наконец-то я обнаружил, что использовал неправильное соглашение о вызове. keybd_event и SendInput обе должны быть вызваны с stdcall вместо ccall.

Смежные вопросы