[meh] Here is an example of how to use [TWAPI] to 'draw' letters in an open MS paint window: ## Draws any text passed to the 'type' procedure in an active ## untitled MS Paint window. ## BUG: First line of text seems to call a newline one character ## before the actual line end. ## Maximum columns (characters across) set max_cols 20 ## Maximum rows (lines of characters) set max_rows 8 puts "MAX_X_LET\=$max_cols" puts "MAX_Y_LET\=$max_rows" ##### puts "init" package require twapi puts "findwin" set win [lindex [split [twapi::find_windows -text "untitled - Paint"]] 0] puts "targetdraw" set origin_x [lindex [split [twapi::get_window_coordinates $win]] 0] set origin_y [lindex [split [twapi::get_window_coordinates $win]] 1] twapi::move_mouse [expr $origin_x+70] [expr $origin_y+50] puts "proceed" set lines 0 set max_rows [expr $max_rows-1] proc select_curvetool {} { global win puts "select_curvetool" set origin_x [lindex [split [twapi::get_window_coordinates $win]] 0] set origin_y [lindex [split [twapi::get_window_coordinates $win]] 1] twapi::move_mouse [expr $origin_x+45] [expr $origin_y+175] twapi::click_mouse_button left twapi::move_mouse [expr $origin_x+30] [expr $origin_y+305] twapi::click_mouse_button left } proc select_brushtool {} { global win puts "select_brushtool" set origin_x [lindex [split [twapi::get_window_coordinates $win]] 0] set origin_y [lindex [split [twapi::get_window_coordinates $win]] 1] twapi::move_mouse [expr $origin_x+45] [expr $origin_y+135] twapi::click_mouse_button left twapi::move_mouse [expr $origin_x+25] [expr $origin_y+260] twapi::click_mouse_button left } proc select_circletool {} { global win puts "select_circletool" set origin_x [lindex [split [twapi::get_window_coordinates $win]] 0] set origin_y [lindex [split [twapi::get_window_coordinates $win]] 1] twapi::move_mouse [expr $origin_x+20] [expr $origin_y+230] twapi::click_mouse_button left twapi::move_mouse [expr $origin_x+20] [expr $origin_y+265] twapi::click_mouse_button left } proc reset_curvetool {} { puts "reset_curvetool" select_brushtool select_curvetool } proc drawletter {letter} { puts "drawletter $letter" set origin_x [lindex [split [twapi::get_mouse_location]] 0] set origin_y [lindex [split [twapi::get_mouse_location]] 1] string tolower $letter select_brushtool twapi::move_mouse $origin_x $origin_y switch $letter { default { return } a { twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] $origin_y after 10 twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+10] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+30] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} } b { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} select_curvetool twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+20] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+20] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} reset_curvetool twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+60] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+60] twapi::send_input {{mouse 0 0 -lup}} } c { select_curvetool twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+20] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x $origin_y twapi::click_mouse_button left twapi::click_mouse_button left select_brushtool twapi::move_mouse $origin_x [expr $origin_y+20] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+60] twapi::send_input {{mouse 0 0 -lup}} select_curvetool twapi::move_mouse $origin_x [expr $origin_y+60] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::click_mouse_button left select_brushtool twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} } d { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} select_curvetool twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} } e { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } f { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+30] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} } g { select_curvetool twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x $origin_y twapi::click_mouse_button left twapi::click_mouse_button left reset_curvetool twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::click_mouse_button left twapi::click_mouse_button left reset_curvetool twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+50] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+50] twapi::click_mouse_button left reset_curvetool twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+30] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::click_mouse_button left } h { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} } i { twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } j { twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+50] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} } k { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } l { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } m { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} } n { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } o { select_circletool twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } p { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} select_curvetool twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+20] twapi::click_mouse_button left } q { select_curvetool twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x $origin_y twapi::click_mouse_button left reset_curvetool twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::click_mouse_button left reset_curvetool twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::click_mouse_button left reset_curvetool twapi::move_mouse [expr $origin_x+40] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::click_mouse_button left select_brushtool twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+60] twapi::send_input {{mouse 0 0 -lup}} } r { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} select_curvetool twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+20] twapi::click_mouse_button left select_brushtool twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } s { select_curvetool twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+20] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x $origin_y twapi::click_mouse_button left reset_curvetool twapi::move_mouse $origin_x [expr $origin_y+20] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+40] twapi::click_mouse_button left reset_curvetool twapi::move_mouse [expr $origin_x+20] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+60] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+40] twapi::click_mouse_button left reset_curvetool twapi::move_mouse [expr $origin_x+40] [expr $origin_y+60] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::click_mouse_button left select_brushtool twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} } t { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+20] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } u { select_curvetool twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::click_mouse_button left reset_curvetool twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::click_mouse_button left select_brushtool twapi::move_mouse $origin_x [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} } v { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} } w { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } x { twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } y { twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+20] [expr $origin_y+40] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -lup}} } z { twapi::move_mouse $origin_x $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -lup}} twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse [expr $origin_x+40] [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} twapi::move_mouse [expr $origin_x+40] $origin_y twapi::send_input {{mouse 0 0 -ldown}} twapi::move_mouse $origin_x [expr $origin_y+80] twapi::send_input {{mouse 0 0 -lup}} } } twapi::move_mouse [expr $origin_x+40] $origin_y } proc newline {} { global win lines puts "newline" set cur_y [lindex [split [twapi::get_mouse_location]] 1] set origin_x [lindex [split [twapi::get_window_coordinates $win]] 0] twapi::move_mouse [expr $origin_x+70] [expr $cur_y+100] incr lines } proc advanceletter {} { global win puts "advanceletter" set cur_x [lindex [split [twapi::get_mouse_location]] 0] set cur_y [lindex [split [twapi::get_mouse_location]] 1] twapi::move_mouse [expr $cur_x+20] $cur_y } proc type {str} { global max_cols max_rows lines win puts "targetdraw" twapi::set_foreground_window $win set origin_x [lindex [split [twapi::get_window_coordinates $win]] 0] set origin_y [lindex [split [twapi::get_window_coordinates $win]] 1] twapi::move_mouse [expr $origin_x+70] [expr $origin_y+50] set strlen [string length $str] puts "recv \[$str\] \($strlen\)" set done 0 while {$done<$strlen} { set chklin [expr $done % $max_cols] if {$chklin == [expr $max_cols-1]} { if {$lines >= $max_rows} { puts "ERR_NOSPACE_Y" set lines 0 return } else { newline } } drawletter [string range $str $done $done] advanceletter incr done } set lines 0 } Basically you change max_cols and max_rows depending on the size of the MS paint drawing area avaliable, and then pass the text to be drawn to the 'type' procedure. If the script runs out of space for the text, it will stop execution and print "ERR_NOSPACE_Y". Characters are drawn within a 40x80 box. The script currently only draws letters, with all unknown characters represented as spaces. I apologise if this is not the correct place for this, but I'm sure it will prove useful or entertaining for someone :)