Имитация нажатий клавиш с помощью Haskell в Windows

Я пытаюсь написать программу на Haskell, которая имитирует нажатия клавиш в Windows. Я пытался вызвать keybd_event и SendInput, но ни один из них не скомпилирован. Я могу запустить программу с переводчиком, хотя. Когда я пытаюсь собрать программу, когда она содержит привязку к SendInput в winable.h, я получаю сообщение об ошибке:

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

Я предположил, что я не мог позвонить 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

Сборка завершается успешно, когда я закомментирую привязки к функциям клавиатуры.

1 ответ

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

Другие вопросы по тегам