Demonstrate the “rendezvous” communications technique by implementing a printer monitor.

OnMessage(0x4a, "PrintMonitor")
SetTimer, print2, 400
 
print1:
  print("Old Mother Goose")
  print("When she wanted to wander,")
  print("Would ride through the air")
  print("On a very fine gander.")
  print("Jack's mother came in,")
  print("And caught the goose soon,")
  print("And mounting its back,")
  print("Flew up to the moon.")
Return
 
print2:
  SetTimer, print2, Off
  print("Humpty Dumpty sat on a wall.")
  print("Humpty Dumpty had a great fall.")
  print("All the king's horses and all the king's men")
  print("Couldn't put Humpty together again.")
Return
 
print(message)
{
  Static StringToSend
  StringToSend := message
  Gui +LastFound
  VarSetCapacity(CopyDataStruct, 12, 0) 
  NumPut(StrLen(StringToSend) + 1, CopyDataStruct, 4)
  NumPut(&StringToSend, CopyDataStruct, 8) 
  SendMessage, 0x4a, 0, &CopyDataStruct
  If ErrorLevel
    MsgBox out of ink
  Sleep, 200
  Return
}
 
PrintMonitor(wParam, lParam, msg)
{
  Static ink = 5
  Global printed
  Critical
  If ink
  {
    StringAddress := NumGet(lParam + 8)   
    StringLength := DllCall("lstrlen", UInt, StringAddress)
    VarSetCapacity(CopyOfData, StringLength)
    DllCall("lstrcpy", "str", CopyOfData, "uint", StringAddress)   
    printed .= "primaryprinter: " . CopyOfData . "`n"
    ToolTip, primary printer`n: %printed%
    ink--
  }
  Else
  {
    OnMessage(0x4a, "Reserve")
    print(CopyOfData)
  }
}
 
Reserve(wParam, lParam, msg)
{
  Static ink = 5
  Global printed
  Critical
  If ink
  {
    StringAddress := NumGet(lParam + 8)   
    StringLength := DllCall("lstrlen", UInt, StringAddress)
    VarSetCapacity(CopyOfData, StringLength)
    DllCall("lstrcpy", "str", CopyOfData, "uint", StringAddress)   
    printed .= "reserveprinter: " . CopyOfData . "`n"
    ToolTip, Reserve printer`n: %printed%
    ink--
  }
  Else
    Return -1
}