    {-# LINE 1 "libraries\\Win32\\Graphics\\Win32\\Window\\PostMessage.hsc" #-}
    {-# LANGUAGE CPP #-}
    {- |

       Module      :  Graphics.Win32.Window.PostMessage

       Copyright   :  2013 shelarcy

       License     :  BSD-style

       Maintainer  :  shelarcy@gmail.com

       Stability   :  Provisional

       Portability :  Non-portable (Win32 API)

       Provide PostMessage function and friends.

    -}
    module Graphics.Win32.Window.PostMessage where

    import Foreign.C.Types ( CIntPtr(..) )
    import Graphics.Win32.GDI.Types ( HWND, MbHWND )
    import Graphics.Win32.Message   ( WindowMessage )
    import System.Win32.Types       ( DWORD, WPARAM, LPARAM, BOOL
                                    , maybePtr, castUINTPtrToPtr, failIfFalse_ )

    #include "windows_cconv.h"

    postMessage :: MbHWND -> WindowMessage -> WPARAM -> LPARAM -> IO ()
    postMessage mb_wnd msg w l =
      failIfFalse_ (unwords ["PostMessage", show mb_wnd, show msg, show w, show l]) $
        c_PostMessage (maybePtr mb_wnd) msg w l

    foreign import WINDOWS_CCONV "windows.h PostMessageW"
      c_PostMessage :: HWND -> WindowMessage -> WPARAM -> LPARAM -> IO BOOL

    foreign import WINDOWS_CCONV "windows.h PostQuitMessage"
      postQuitMessage :: Int -> IO ()

    postThreadMessage :: DWORD -> WindowMessage -> WPARAM -> LPARAM -> IO ()
    postThreadMessage tId msg w l =
      failIfFalse_ (unwords ["PostThreadMessage", show tId, show msg, show w, show l]) $
        c_PostThreadMessage tId msg w l

    foreign import WINDOWS_CCONV "windows.h PostThreadMessageW"
      c_PostThreadMessage :: DWORD -> WindowMessage -> WPARAM -> LPARAM -> IO BOOL

    hWND_BROADCAST  :: HWND
    hWND_BROADCAST  = castUINTPtrToPtr 65535

    {-# LINE 46 "libraries\\Win32\\Graphics\\Win32\\Window\\PostMessage.hsc" #-}

    foreign import WINDOWS_CCONV "windows.h InSendMessage"
      inSendMessage :: IO Bool