Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I want to have custom text printed on my screen always on top. I tried rainmeter software and i could not find option to load text from file on my system or in any other way.

What i want to have is software that prints on top of all windows and scan file every seconds to print latest changes.

P.S. the idea would be to have my live PHP website error log printed on my screen every second or as new entres appear.

share|improve this question
Which operating system? Windows XP/Vista/7? – iglvzx Jun 27 '12 at 20:07
It does not matter i have both XP and 7 installed and can install any as needed. – Petja Jun 27 '12 at 21:04

I've managed to get this to work, but you might have to play with the transparency / font size / background colour to get it so it is easy to read.

You'll need to install AutoHotKey and run this script:

There are some comments in the code, but briefly it will: read 5 lines from the end of the specified log file; create a window and add this as text on the window; make the window transparent, always on top, and "unclickable"; and update the text every 1 seconds (might need to increase this, but i don't see a huge performance hit - even with a 20mb log file).

To exit the script, right click the AutoHotKey icon in your system tray and choose Exit.

If my links are broken, the AHK code follows:

#SingleInstance force
; Example: On-screen display (OSD) via transparent window:
FileName := "C:\xampplite\apache\logs\access.log"
NumLines = 5
CustomColor = FF8080 ; The transparent background color of the window, set this to something close to your text colour to avoid white highlighting

Gui +LastFound +AlwaysOnTop -Caption +ToolWindow +E0x20  ; +ToolWindow avoids a taskbar button and an alt-tab menu item.
Gui, Color, %CustomColor%
Gui, Font, s12  ; Set a large font size (12-point).
errorTail := FileTail(FileName , NumLines) ; get the text from the file, last 5 lines
Gui, Add, Text, vMyText cRed Y+0, %errorTail%  ; add it, colour is Red, R5 sets 5 rows

; choose one of these lines, first one show just the text, second one has a background for readability
WinSet, TransColor, %CustomColor% 200 ; Make all pixels of this color transparent and make the text itself translucent (250)
;Winset, Transparent, 150

SetTimer, UpdateOSD, 1000 ; 1 second timer set here
Gui, Show, x0 y600 NoActivate  ; Set the x and y position. NoActivate avoids deactivating the currently active window.

UpdateOSD: ; the repeated timer routine
errorTail := FileTail(FileName, NumLines) ;get 5 lines
GuiControl,, MyText, %errorTail%

; ======================================================================================================================
; Function:    Retrieve the last lines of a text file.
; AHK version:  1.1.07+
; Parameters:
;    FileName -  the name of the file, assumed to be in A_WorkingDir if an absolute path isn't specified
;    Lines  -  number of lines to read - default: 10 (like Unix)
;    NewLine  -  new line character(s)   - default: `r`n (Windows)
; Return values:
;    On success: The required lines, if present
;    On failure: ""
; Version: me
; ======================================================================================================================
FileTail(FileName, Lines = 10, NewLine = "`r`n") {
   Static MaxLineLength := 256 ; seems to be reasonable to start with
   If !IsObject(File := FileOpen(FileName, "r"))
      Return ""
   Content := ""
   LinesLength := MaxLineLength * Lines * (InStr(File.Encoding, "UTF-16") ? 2 : 1)
   FileLength := File.Length
   BytesToRead := 0
   FoundLines := 0
   While (BytesToRead < FileLength) && !(FoundLines) {
      BytesToRead += LinesLength
      If (BytesToRead < FileLength)
         File.Pos := FileLength - BytesToRead
         File.Pos := 0
      Content := RTrim(File.Read(), "`r`n")
      If (FoundLines := InStr(Content, NewLine, 0, 0, Lines))
         Content := SubStr(Content, FoundLines + StrLen(NewLine))
   Return Content
share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .