5

我正在尝试编写一个在 Windows 上模拟击键的 Haskell 程序。我尝试调用 keybd_event 和 SendInput,但都没有编译。不过,我可以使用解释器运行程序。当我在 winable.h 中包含与 SendInput 的绑定时尝试构建程序时,我收到错误消息:

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

我认为由于 #if ,我无法调用SendInputwinuser.h :

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

当我添加绑定时_WIN32_WINNT,值为 0x400。

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

当我注释掉与键盘功能的绑定时,构建成功。

4

1 回答 1

1

我终于发现我使用了错误的调用约定。 keybd_event并且SendInput都需要使用stdcall而不是调用ccall

于 2013-11-07T03:07:26.233 回答