WinBatch® Technical Support Forum

All Things WinBatch => WinBatch => Topic started by: pguild on April 24, 2021, 11:10:18 PM

Title: How move Message window or Pause Window?
Post by: pguild on April 24, 2021, 11:10:18 PM
GRR! Third time trying to post this question.  >:(
How can I move the window created by the pause command or the message command?
If not possible is there a workaround?
Title: Re: How move Message window or Pause Window?
Post by: kdmoyers on April 25, 2021, 09:15:07 AM
If your need is just functional, not cosmetic, then this is a cheap hack:
Code (winbatch) Select
  #definefunction askmessage(x,y,width,height,title,mess)

    ; this controls placement of certain AskXxxx functions
    intcontrol(63, x, y, x+width, y+height)

    AskTextBox( title, "", mess, 2, 0)

  #endfunction

  message("hey","there")

  askmessage(110,110,400,400,"hey","there")
Title: Re: How move Message window or Pause Window?
Post by: td on April 26, 2021, 06:59:07 AM
Or if you don't mind a little more work you could use the WIL Dialog function to create your own message box.
Title: Re: How move Message window or Pause Window?
Post by: kdmoyers on April 26, 2021, 09:07:49 AM
Attached is a cool bunch of code that demonstrates a number of techniques for making specialized message boxes.

it contains these functions:
Code (winbatch) Select

#DEFINESUBROUTINE MessageUdfProc(dlgMessageUdfHandle,dlgMessageUdfEvent,dlgMessageUdfEventControlID,dlgMessageUdfParam4,dlgMessageUdfParam5)

#DEFINEFUNCTION udfMessage(Title,Text,TextJust,Timeout,Buttons,PositionBox)

Title: Re: How move Message window or Pause Window?
Post by: cssyphus on May 18, 2021, 09:10:32 AM
In addition to Sean Dorn's udfMessage() function that Kirby posted, do not miss IFICantBYTE's Rube-Goldberg-All-In-One-Super-Fragalistic Message Box, here:
https://forum.winbatch.com/index.php?topic=1556.0


It is also nice to know about this simple WSH messagebox implementation (although it doesn't help with repositioning the dialog window):


#DefineFunction udfWSHMessage(Timeout,TitleText,MessageText,DisplayFlags) ;-------------------
    oWSHShell = ObjectCreate("WScript.Shell")
    Ret = oWSHShell.popup(MessageText,Timeout,TitleText,DisplayFlags)
    oWSHShell = 0
    Return(Ret)

    ;EXAMPLES:
    ;Test1 = udfWSHMessage(5,"Test 1","5 second timeout with STOP icon and OK button.",16)
    ;Test2 = udfWSHMessage(7,"Test 2","7 second timeout with QUESTION MARK icon and OK and CANCEL buttons.",32|1)
    ;Test3 = udfWSHMessage(8,"Test 3","8 second timeout with EXCLAMATION icon and ABORT RETRY IGNORE buttons. IGNORE has been made the DEFAULT option.",48|2|512)
    ;Test4 = udfWSHMessage(4,"Test 4","4 second timeout with NO icon and just an OK button.",0)
    ;0==OK, 1==OK|Cancel, 2==Abort|Retry|Ignore, 4==Yes|No, 8==nothing, 16==RedX, 32==?mark, 64==info, 128==blank spot, 256==noIcon
    ;timeout= -1, OK==1, Cancel==2, abort==3, retry==4, yes==6, no==7
#EndFunction ;udfWSHMessage ------------------------------------------------------------------
Test2 = udfWSHMessage(7,"My Dlg Title","7 second timeout with QUESTION MARK icon and OK and CANCEL buttons.",32|1)
   

I would have thought that this would work, but sadly no:


Test2 = udfWSHMessage(7,"My Dlg Title","7 second timeout with QUESTION MARK icon and OK and CANCEL buttons.",32|1)
winPlace(50,50,100,300,`My Dlg Title`)


But the 20 minutes that you spend experimenting with IFICantBYTE's and Sean Dorn's udfMessage() functions will pay many future dividends.
Title: Re: How move Message window or Pause Window?
Post by: rw_baker on May 20, 2021, 10:02:20 AM
Place the bare-bones script below on the Desktop and run with:

run("C:\Users\user\Desktop\bare bones.WBT","'try it' 30 173 159 338")
pause("try it","")

;
win_title = param1
ok = WinWaitExist(win_title,3)
terminate(!ok,"Window did not show!",param1)
for i = 1 to 4
   j = i + 1
   coord%i% = param%j%
next
WinPlace(coord1,coord2,coord3,coord4,win_title)
exit
;
Generalize the script by using "WinPlaceGet" to find the original coordinates, adjust these to get the target
location and use "WinPlace" to finish.


RW Baker
Title: Re: How move Message window or Pause Window?
Post by: cssyphus on May 21, 2021, 08:57:26 AM
That's an interesting demo, RW, and it does work as advertised -- but it requires an external script to reposition the message() or pause() dialogs, which is not strictly what is being asked.

On the other hand, your example proves that one could spawn such an external app -- it needn't even pre-exist (one could filePut() it into existence, run() it, and fileDelete() it when done) -- and solve the problem that way.

Good idea, sir.
Title: Re: How move Message window or Pause Window?
Post by: rw_baker on May 21, 2021, 07:24:33 PM
Thanks for your comments.  I have used the full script for many years, it is stored in my utilities directory.  The following gives the full script's comments and an example of its use:

;Script: Delayed WinPlace.WBT - A script to move a window on the screen.
;  param1:  is the partial window title.
;  param2:  if it has the format x-ulc,y-ulc,x-brc,y-brc then the window is moved to these coordinates,
;           example: 100,200,300,400
;           if its first character is + or - then the format should be: +/-xdisp,+/-ydisp, example: +100,-100
;           this example would move the window x-coord right 100 units and the y coord up 100 units.
;           In this format the window always remains the same size.

; Sample run to move the message window right 100 and up 100 units:
run("F:\WBT\Utilities\Delayed WinPlace.WBT",'"a test" +100,-100')
message("a test","")
exit

RW Baker
Title: Re: How move Message window or Pause Window?
Post by: cssyphus on August 07, 2021, 08:58:44 AM
I used that trick today, RW, and it worked poifectly. Thanks again for the great idea. What I did was this:

1. Created the entire MoveMsgWindow .wbt script as a string in a variable (using %@CRLF% between lines)

2. filePut() the string into a file on disk, preserving the file name in a variable

3. Used run() to run the script just saved to disk

4. Executed the message (in my case, calling an instance of Sean Dorn's _udfMessage)

5. The message was instantly relocated, with no visible flash or movement

6. fileDelete() the .wbt that moved the message window

Here's the code:


_killMe = udfMoveAlarmToMon2(_almTitle) ;only moves alarm if _zoomActive and _numMons > 1 (both defined inside udf)
    _udfMsgTitle = _almTitle
    _udfMsgText = _alarmMsg
    _udfMsgJust = `Center`
    _udfTimeOut = 8
    _udfButtons = `OK|Remind 5m|Remind 15m|Remind 30m|Msg2ClipBd|Reschedule|Cancel`
    _udfPositon = `0,0,1000,1000`
_almUserClick = udfMessage(_udfMsgTitle,_udfMsgText,_udfMsgJust,_udfTimeout,_udfButtons,_udfPositon)
if _killMe != 0 then fileDelete( dirScript() : _killMe : `.wbt` )


and the udf:


#DEFINEFUNCTION udfMoveAlarmToMon2(_almTitle) ;---------------------------------------
    debugTrace(22)
    _numMons = winMetrics(80)
    _zoomActive = winExist(`ConfMeetingNotfiyWnd`)
    IF _numMons > 1 && _zoomActive
        ;debugTrace(22)
        _dtCode = timeFormat(timeYmdHms(), `yyMMdd_hhmmss`)
        _f = `_st = timeYmdHms()` : @CRLF : `while 1` : @CRLF : `if winExist('%_almTitle%')` : @CRLF : `_pp = arrayize(winPosition('%_almTitle%'), ",")` : @CRLF : `_tx = _pp[0] - 1000` : @CRLF : `_bx = _pp[2] - 1000` : @CRLF : `winPlace( _tx, _pp[1], _bx, _pp[3],  '%_almTitle%' )` : @CRLF : `return` : @CRLF : `endif` : @CRLF : `yields(250)` : @CRLF : `if timeDiffSecs(timeYmdHms(), _st) > 20 then Break` : @CRLF : `endwhile`
        filePut(dirScript() : _dtCode : `.wbt`, _f)
        yields(20)
        run(dirScript() : _dtCode : `.wbt`, ``)
        return _dtCode
    ENDIF
    return 0
#ENDFUNCTION ;udfMoveAlarmToMon2() ---------------------------------------------------


PS: You might wonder why I prefix my varnames with an underscore... It just makes them easier to search for... e.g. searching for _message will not return all instances of message()
Title: Re: How move Message window or Pause Window?
Post by: rw_baker on August 12, 2021, 10:07:26 AM
Interesting! Thanks.
RW Baker