System/Win32/Console/HWND.hs
{- |
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 (getConsoleHWND) 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