{- |

   Module      :  System.Win32.Console.HWND

   Copyright   :  2009 Balazs Komuves, 2013 shelarcy

   License     :  BSD-style



   Maintainer  :  shelarcy@gmail.com

   Stability   :  Provisional

   Portability :  Non-portable (Win32 API)



   Get the handle of the current console window.

-}

module System.Win32.Console.HWND where

import Control.Concurrent           ( threadDelay )

import Control.Exception            ( bracket )

import Foreign.Ptr                  ( nullPtr )

import Graphics.Win32.Window        ( c_FindWindow )

import Graphics.Win32.GDI.Types     ( HWND )

import System.Win32.Console.Title   ( getConsoleTitle, setConsoleTitle )

import System.Win32.Process ( getCurrentProcessId )

import System.Win32.String          ( withTString )

import System.Win32.Time            ( getTickCount )



-- | Get the handle of the current console window by using window's title.

-- See: <http://support.microsoft.com/kb/124103>

getConsoleHWND :: IO HWND

getConsoleHWND

  = bracket getConsoleTitle setConsoleTitle $ \_ -> do

        time   <- getTickCount

        pid    <- getCurrentProcessId

        let unique = show time ++ show pid

        setConsoleTitle unique

        threadDelay (42*1000)

        withTString unique $ \punique ->

            c_FindWindow nullPtr punique