Dialog Shortcut Issue

Started by JTaylor, March 17, 2014, 06:37:45 PM

Previous topic - Next topic

JTaylor

I have a weird problem and hoping someone else has seen it and can tell me the problem.  I have an item list which I have configured to perform a certain action on double-click and also the same action with a pushbutton.  Everything works great except for when I use the Alt+key combination for the pushbutton.   It activates the button and does everything except pasting the text in another window.  If I put a 1 second timedelay it works (a .1 second delay doesn't) and if I pop up a message to make sure the text is correct it works.  Just not with the regular process.   Obviously seems like a timing issue but should see the same behavior when clicking the pushbutton, I would think.   I also put a while statement to make sure the right window was active and that the text is there but still no joy.  Any ideas?  It happens with more than one pushbutton.  I've tried changing the key combination but it always fails with the key combination and always works with the pushbutton and the double-click...it is not a hit-miss thing.  Ideas?

Thanks.

Jim

kdmoyers

crazy idea: maybe the action itself has something to do with it? what if, just for testing, you changed the action to something that has absolutely no side effect, like simply setting x=1.  would the Altkey and the pushbutton still have different effects?

not even $0.02
-Kirby
The mind is everything; What you think, you become.

JTaylor

Appreciate the reply and a good idea but still see the same behavior.   Turned off the timer event but no difference either.    Experimented with different delays and it takes at least a .3 second delay to work, at least on my machine, and that isn't too distracting so may go with that for now or just remove the key combination option altogether.   I could understand the problem if it worked the same way when clicking the button directly.   It is the difference between clicking and the key combination that makes no sense to me.   Also, the one button is set as the Default and it works too.

Jim

Deana

Quote from: JTaylor on March 17, 2014, 06:37:45 PM
I have a weird problem and hoping someone else has seen it and can tell me the problem.  I have an item list which I have configured to perform a certain action on double-click and also the same action with a pushbutton.  Everything works great except for when I use the Alt+key combination for the pushbutton.   It activates the button and does everything except pasting the text in another window.  If I put a 1 second timedelay it works (a .1 second delay doesn't) and if I pop up a message to make sure the text is correct it works.  Just not with the regular process.   Obviously seems like a timing issue but should see the same behavior when clicking the pushbutton, I would think.   I also put a while statement to make sure the right window was active and that the text is there but still no joy.  Any ideas?  It happens with more than one pushbutton.  I've tried changing the key combination but it always fails with the key combination and always works with the pushbutton and the double-click...it is not a hit-miss thing.  Ideas?

Thanks.

Jim

Hmmm. The obvious difference between using the keystroke verses clicking push button is Keyboard versus Mouse. The trick will be to add the code to ensure that the window that you are attempting to PASTE to is active and READY to accept input. You could maybe use WinWaitReady. Basically it waits until an application is ready and waiting for user input.

Deana F.
Technical Support
Wilson WindowWare Inc.

JTaylor

Thanks...another excellent idea but unfortunately the same behavior.  The cursor and focus all ends up in the right place...just no text.

Jim

Deana

You might try using the Control Manager Extender cSetFocus function to give the windows control focus before pasting the text. cSetFocus sets the keyboard focus to the control window specified by the input window handle.

Deana F.
Technical Support
Wilson WindowWare Inc.

JTaylor

RoboScripter doesn't detect an ID and it generates an error about winids and derived ids not matching.   My next step is to see if I can reproduce the issue in something I can post here...or just not worry about it and remove "&" so the key combinations can't be used.   In this case it isn't a big deal but would love to know the reason for the difference in behavior.

Jim

Deana

Posting some code will go a long way in helping to determine the cause.
Deana F.
Technical Support
Wilson WindowWare Inc.

JTaylor

Curious if anyone else sees the same behavior.  Be aware that will paste the same text each time no matter which item you select.   The question is if click the Apply button acts differently than pressing Alt+a.

Thanks.

Jim

Code (winbatch) Select

AddExtender("wwctl44i.dll")
GoSub Load_Routines
Init_Dialog_Constants()
Run("Notepad.exe","")
Get_rCol_List()
RPLFormat=`WWWDLGED,6.2`

RPLCaption=`Report Field List`
RPLX=001
RPLY=001
RPLWidth=140
RPLHeight=351
RPLMinWidth=140
RPLMinHeight=250
RPLNumControls=003
RPLProcedure=`RPL_Sub`
RPLFont=`DEFAULT`
RPLTextColor=`DEFAULT`
RPLBackground=`DEFAULT,62|62|85`
RPLConfig=0

RPL001=`005,003,030,012,PUSHBUTTON,"pb_RPL_Apply",DEFAULT,"&Apply",1,9,32,DEFAULT,DEFAULT,DEFAULT`
RPL002=`005,019,128,326,ITEMBOX,"ib_RPL_rpt_fields",rpt_fields,DEFAULT,DEFAULT,6,256,"Microsoft Sans Serif|6656|40|34",DEFAULT,DEFAULT`
RPL003=`103,003,030,012,PUSHBUTTON,"pb_RPL_Exit",DEFAULT,"E&xit",2,15,DEFAULT,DEFAULT,DEFAULT,DEFAULT`

ButtonPushed=Dialog("RPL")


:Load_Routines


#DefineSubRoutine Get_rCol_List()

  rpt_fields_list = "BIN":@TAB:"BIN_COPY_CNT":@TAB:"BIN_ITEM_CNT":@TAB:"BIN_VALUE":@TAB:"BIN":@TAB:"DATE":@TAB:"TIME":@TAB:"DETAILBLOCK":@TAB:"MATH":@TAB:"OFFER_COPY_CNT":@TAB:"OFFER_ITEM_CNT":@TAB:"OFFER_VALUE":@TAB:"SUM":@TAB:"COUNT"
  rpt_fields      = "BIN"

#EndSubRoutine

#DefineSubRoutine RPL_Sub(RPL_Handle,DMsg,DCID,DEInfo,ChangeInfo)

Switch (DMsg)
    Case msg_init                 ; Dialog Initialization
    DialogProcOptions(RPL_Handle, dpo_disablestate,0)                     ; Dialog Disable (1-Disable, 2-Wait cursor, 0-Enable).
    DialogProcOptions(RPL_Handle, dpo_changebackground,-1)                ; Change Dialog Background (Bitmap File or RGB String).
    DialogProcOptions(RPL_Handle, msg_buttonpushed,1)                     ; PushButton/PictureButton.
    DialogProcOptions(RPL_Handle, msg_itemselect,1)                       ; ItemBox.
    DialogProcOptions(RPL_Handle, msg_itemboxdoubleclick,1)               ; ItemBox Double-Clicked.
    DialogProcOptions(RPL_Handle, msg_editbox,1)                          ; EditBox or Multi-LineBox.
    DialogControlSet(RPL_Handle,"ib_RPL_rpt_fields",dc_itemboxcontents,rpt_fields_list)
    DialogControlSet(RPL_Handle,"ib_RPL_rpt_fields",dc_itemboxselect,rpt_fields)     
    Break
  Case msg_itemboxdoubleclick   ; ItemBox DC
    Switch(DialogProcOptions(RPL_Handle,dpo_getnumber,DCID))
      Case DialogProcOptions(RPL_Handle,dpo_getnumber,"ib_RPL_rpt_fields")
        rpt_fields = "DETAILBLOCK}{/DETAILBLOCK"
        xtxt = "{":StrReplace(rpt_fields," ",""):"}"
        ClipPut(xtxt)
        WinActivate("~Notepad")
        SendKey("^v")
        Break
    EndSwitch
    Break
  Case msg_buttonpushed         ; PushButtion
    Switch(DialogProcOptions(RPL_Handle,dpo_getnumber,DCID))
      Case DialogProcOptions(RPL_Handle,dpo_getnumber,"pb_RPL_Apply")
        nSelection = DialogControlGet(RPL_Handle,"pb_RPL_Apply",dc_title)
        ClipPut("")
        rpt_fields = "DETAILBLOCK}{/DETAILBLOCK"
        xtxt = "{":StrReplace(rpt_fields," ",""):"}"
        ClipPut(xtxt)

;       ControlHandle=cWndByWndSpec("Notepad","notepad",2,15,1025)
;       cSetFocus(ControlHandle)  ; Activates Window

        WinActivate("~Notepad")
        SendKey("^v")
        Break
      Case DialogProcOptions(RPL_Handle,dpo_getnumber,"pb_RPL_Exit")
        nSelection = DialogControlGet(RPL_Handle,"pb_RPL_Exit",dc_title)
        Return 9
        Break
    EndSwitch
    Break
EndSwitch
Return -2

#EndSubRoutine

#DefineSubRoutine Init_Dialog_Constants()

   MSG_INIT               = 0    ; The one-time initilization
   MSG_TIMER              = 1    ; Timer event
   MSG_BUTTONPUSHED       = 2    ; Pushbutton or Picturebutton
   MSG_RADIOPUSHED        = 3    ; Radiobutton clicked
   MSG_CHECKBOX           = 4    ; Checkbox clicked
   MSG_EDITBOX            = 5    ; Editbox or Multilinebox
   MSG_FILESELECT         = 6    ; Filelistbox
   MSG_ITEMSELECT         = 7    ; Itembox
   MSG_COMBOCHANGE        = 8    ; Combobox/Droplistbox
   MSG_CALENDAR           = 9    ; Calendar date change
   MSG_SPINNER            = 10   ; Spinner number change
   MSG_CLOSEVIA49         = 11   ; Close clicked (Enabled via Intcontrol 49)
   MSG_FILEBOXDOUBLECLICK = 12   ; Get double-click message on a FileListBox
   MSG_ITEMBOXDOUBLECLICK = 13   ; Get double-click message on an ItemBox
   MSG_COMEVENT           = 14   ; Get double-click message on an ItemBox
   MSG_MENUITEM           = 15   ; MenuItem selected
   MSG_MENUITEMINIT       = 16   ; MenuItem initialized
   MSG_RESIZE             = 17   ; Dialog resized
   MSG_RVITEMSELROW       = 18   ; Reportview item select row
   MSG_RVDBLCLICKROW      = 19   ; Reportview double-click row
   MSG_RVCHECKEDITEM      = 20   ; Reportview checked/unchecked Item
   MSG_RVITEMTEXT         = 21   ; Reportview item text
   MSG_RVHEADER           = 22   ; Reportview header clicked

   DPO_DISABLESTATE       = 1000 ; codes -1=GetSetting 0=EnableDialog 1=DisableDialog
   DPO_CHANGEBACKGROUND   = 1001 ; -1=GetSetting otherise bitmap or color string
   DPO_CHANGESYSMENU      = 1002 ; -1=Get Current 0=none 1=close 2=close/min 3=close/max 4=close/min/max
   DPO_CHANGETITLE        = 1003 ; -1=Get Current otherise new title
   DPO_GETNAME            = 1004 ;  Returns the name associated with a control's number.
   DPO_GETNUMBER          = 1005 ;  Returns the number associated with a control's name.
   DPO_GETCLIENTAREA      = 1007 ;  Returns the number associated with a control's name.


   ;DialogControlState Constants
   DCSTATE_SETFOCUS       = 1      ; Give Control Focus
   DCSTATE_QUERYSTYLE     = 2      ; Query control's style
   DCSTATE_ADDSTYLE       = 3      ; Add control style
   DCSTATE_REMOVESTYLE    = 4      ; Remove control style
   DCSTATE_GETFOCUS       = 5      ; Get control that has focus
   DCSTATE_MOVEMOUSEOVER  = 6      ; Move the mouse over the control

   DCSTYLE_INVISIBLE      = 1      ; Set Control Invisible
   DCSTYLE_DISABLED       = 2      ; Set Control Disabled
   DCSTYLE_NOUSERDATA     = 4      ; Note: Setable via DialogControlState function ONLY SPINNER control only
   DCSTYLE_READONLY       = 8      ; Sets control to read-only (user cannot type in data) EDITBOX MULTILINEBOX SPINNER
   DCSTYLE_PASSWORD       = 16     ; Sets 'password mode' where only *'s are displayed EDITBOX
   DCSTYLE_DEFAULTBUTTON  = 32     ; Sets a button as a the default button PUSHBUTTON PICTUREBUTTON
   DCSTYLE_DIGITSONLY     = 64     ; Set edit box to accept digits only EDITMOX MULTILINEBOX
   DCSTYLE_FLAT           = 128    ; Makes a 'flat' hyperlink-looking button PUSHBUTTON PICTUREBUTTON
   DCSTYLE_HEIGHT         = 256    ; Turns off automatic height adjustment on ItemBoxes and FileListBoxes
   DCSTYLE_CENTER         = 512    ; Center Text in VARYTEXT and STATICTEXT Controls
   DCSTYLE_RIGHT          = 1024   ; Right Justify Text in VARYTEXT and STATICTEXT Controls
   DCSTYLE_NOSELCURLEFT   = 2048   ; No selection, cursor left EDITBOX MULTILINEBOX
   DCSTYLE_NOSELCURRIGHT  = 4096   ; No selection, cursor right EDITBOX MULTILINEBOX
   DCSTYLE_NOSELCURRIGHT  = 4096   ; No selection, cursor right EDITBOX MULTILINEBOX
   DCSTYLE_SHIELD         = 8192   ; Display Security Shield icon on button (Vista only) PUSHBUTTON PICTUREBUTTON
   DCSTYLE_MENUCHECK      = 32768  ; Adds a check mark to the left of a menu item MENUITEM
   DCSTYLE_MENURADIO      = 65536  ; Adds a radio button like dot graphic to the left of a menu item MENUITEM
   DCSTYLE_MENUSEP        = 131072 ; Causes a separator bar graphic to display instead of text at the menu item's location in the menu MENUITEM
   DCSTYLE_MENUBREAK      = 262144 ; Cause a column break to occur at the specific item when used with drop-down, context, or submenus.  Causes a line break (new row) with menu items hosted directly by the MENUBAR MENUITEM
   DCSTYLE_NOHEADER       = 524288    ; No header bar REPORTVIEW
   DCSTYLE_COLHEADER      = 1048576   ; First row column header REPORTVIEW
   DCSTYLE_GRIDLINES      = 2097152   ; Grid lines REPORTVIEW
   DCSTYLE_SELONEROW      = 4194304   ; Only one row can be selected at a time REPORTVIEW
   DCSTYLE_SELALLROW      = 8388608   ; Highlight complete row REPORTVIEW
   DCSTYLE_SORTASC        = 16777216  ; Ascending sort REPORTVIEW
   DCSTYLE_SORTDESC       = 33554432  ; Descending sort REPORTVIEW
   DCSTYLE_EDITCOL        = 67108864  ; Edit first columns text REPORTVIEW
   DCSTYLE_COLCHECKBOX    = 134217728 ; Add checkbox to first column REPORTVIEW
   DCSTYLE_INSHEADER=268435456   ; Include column header text REPORTVIEW



   ;DialogControlSet / DialogControlGet Constants
   DC_CHECKBOX            = 1    ; CHECKBOX
   DC_RADIOBUTTON         = 2    ; RADIOBUTTON
   DC_EDITBOX             = 3    ; EDITBOX MULTILINEBOX
   DC_TITLE               = 4    ; PICTURE RADIOBUTTON CHECKBOX PICTUREBUTTON VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON
   DC_ITEMBOXCONTENTS     = 5    ; ITEMBOX FILELISTBOX DROPLISTBOX
   DC_ITEMBOXSELECT       = 6    ; ITEMBOX FILELISTBOX DROPLISTBOX
   DC_CALENDAR            = 7    ; CALENDAR
   DC_SPINNER             = 8    ; SPINNER
   DC_MULTITABSTOPS       = 9    ; MULTILINEBOX
   DC_ITEMSCROLLPOS       = 10   ; ITEMBOX FILELISTBOX
   DC_BACKGROUNDCOLOR     = 11   ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX
   DC_PICTUREBITMAP       = 12   ; PICTURE PICTUREBUTTON
   DC_TEXTCOLOR           = 13   ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FIELLISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX
   DC_ITEMBOXADD          = 14   ; ITEMBOX FILELISTBOX DROPLISTBOX
   DC_ITEMBOXREMOVE       = 15   ; ITEMBOX FILELISTBOX DROPLISTBOX
   DC_RADIOCONTROL        = 16   ; RADIOBUTTON
   DC_POSITION            = 17   ; RADIOBUTTON
   DC_MENUNAMES           = 18   ; ALL CONTROLS
   DC_HANDLE              = 19   ; ALL CONTROLS (Except MENUBAR and MENUITEM)
   DC_RVCOLHEAD           = 20   ; REPORTVIEW
   DC_RVCOLWIDTH          = 21   ; REPORTVIEW
   DC_RVCOLMATCH          = 24   ; REPORTVIEW
   DC_RVCANCELEDIT        = 25   ; REPORTVIEW
   DC_RVCHECKEDROWS       = 26   ; REPORTVIEW
   DC_RVJUSTIFY           = 27   ; REPORTVIEW

   ;DialogObject constants
   
   DLGOBJECT_ADDEVENT     = 1    ; Call dialog callback when the specified event occurs 
   DLGOBJECT_REMOVEEVENT  = 2    ; Stop calling dialog callback when an event previously requested with 
   DLGOBJECT_GETOBJECT    = 3    ; Return an object references to the specified control
   DLGOBJECT_GETPICOBJECT = 4    ; Create and return an object reference to a picture object

   ;Return code constants
   RET_DO_CANCEL          =  0   ; Cancels dialog
   RET_DO_DEFAULT         = -1   ; Continue with default processing for control
   RET_DO_NOT_EXIT        = -2   ; Do not exit the dialog

#EndSubRoutine

Return

Deana

It does appear to require a bit more time before its ready to send the keystrokes. Seems to work for me if I give it a TimeDelay 0.25.
Deana F.
Technical Support
Wilson WindowWare Inc.

JTaylor

I didn't get that fine with the timing so was using .3 but it sounds like it works the same for you so I guess the question is,  Why?

If I hit ENTER, since it is the default button it works fine.  What is different with that keyboard command over Alt+a and, of course, with just clicking the button?

The action time on the button is the same as far as I can tell.

Jim

George Vagenas

To continue the weirdness, this fixes the problem:
Code (winbatch) Select
;         WinActivate("~Notepad")
;         SendKey("^v")
        Sendmenusto('~Notepad', 'Edit Paste')
        Break

Just curious, why the clipput("") line?
Thanks

George

JTaylor

Thanks for the reply/suggestion.   KompoZer is what I'm using and it doesn't seem to allow some of the functions that use use Window names.   SendMenusTo gives an error.   Used Notepad in the example since I knew everyone would have that available.

The clipput("") was left over from one of the many things I tried when attempting to figure out what was going on.  Just didn't get it removed.

Jim

kdmoyers

Wonder if using the "hidden menu" key assignment trick to map the alt-key combo would sidestep the issue?  We are having good luck with it.
-Kirby
The mind is everything; What you think, you become.

JTaylor

"hidden menu"?   Create a menu with an assigned key and then hide it but it still works?

Jim

kdmoyers

Yeah. this dialog has a menuitem control that is triggered by F7 key, generating a menu event, yet shows no menu bar:

Code (winbatch) Select
MyDialogFormat=`WWWDLGED,6.2`
MyDialogCaption=`WIL Dialog 1`
MyDialogX=106
MyDialogY=163
MyDialogWidth=200
MyDialogHeight=103
MyDialogNumControls=003
MyDialogProcedure=`DEFAULT`
MyDialogFont=`DEFAULT`
MyDialogTextColor=`DEFAULT`
MyDialogBackground=`DEFAULT,DEFAULT`
MyDialogConfig=0
MyDialog001=`031,045,036,012,PUSHBUTTON,"PushButton_OK",DEFAULT,"OK",1,10,32,DEFAULT,DEFAULT,DEFAULT`
MyDialog002=`089,043,036,012,PUSHBUTTON,"PushButton_Cancel",DEFAULT,"Cancel",0,20,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog003=`000,000,000,000,MENUITEM,"mbi1_MyDialog","\{F7}","Add Text Here",DEFAULT,10,DEFAULT`
ButtonPushed=Dialog("MyDialog")
The mind is everything; What you think, you become.

JTaylor

Interesting...didn't know you could define a shortcut, such as F7, in that fashion.  Thanks.

Still curious about the other behavior though  :)

Jim

....IFICantBYTE

I think it's the physical holding down of the "ALT" key while pressing the "A" when the focus is on the list that is causing the pasting issue.
Perhaps the ALT keyboard status is being held over to the next commands in your script and interfering somehow... don't ask me exactly how/why, and why it works with a time delay - I just suspect this based on guesses and what I've found testing your script....

Here's why I think this is so...

  • If you run your script and give focus to either of the buttons rather than the list, and then just press "A", it works, just as the ENTER key does, if you hold down ALT and A it doesn't work.
  • If you use Windows's sticky-key option on your script (Ease of access feature where the ALT combinations can be done one key at a time) it works, even if the list is in focus, because the ALT key is not actually being held down physically.
  • If you use RoboScripter (or another winbatch script) to send the ALT-a key combo to your script's dialog it also works.. again, i suspect, because the actual hardware ALT key is not held down while the next commands in your script are being processed.

I know this doesn't really help you fix it, but it is kind of interesting, and may help Deana or Tony in some way?
Regards,
....IFICantBYTE

Nothing sucks more than that moment during an argument when you realize you're wrong. :)

kdmoyers

Quote from: ....IFICantBYTE on March 19, 2014, 04:50:31 PM
I think it's the physical holding down of the "ALT" key while pressing the "A" when the focus is on the list that is causing the pasting issue.
Yep, that sounds right to me as well.
The mind is everything; What you think, you become.

Deana

Here is an topic that helps explain Keyboard Accelerators and how they are handled under the hood.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646335(v=vs.85).aspx

I suspect this process is slightly slower than the button press hence the need for a small TimeDelay.
Deana F.
Technical Support
Wilson WindowWare Inc.

JTaylor

Thanks.  Interesting article.   Surprised I haven't run into a similar problem before.  Now if I can only have back all the hours I spent trying to figure out what was wrong :)

Jim

Deana

Quote from: JTaylor on March 20, 2014, 12:17:17 PM
Thanks.  Interesting article.   Surprised I haven't run into a similar problem before.  Now if I can only have back all the hours I spent trying to figure out what was wrong :)

Jim

You're welcome. As for the lost hours, I recommend the WinBatch TimeMachine() function.  ;)
Deana F.
Technical Support
Wilson WindowWare Inc.

JTaylor

Is that the function Bill Murray used?   Does it still contain that

Code (winbatch) Select

While You_Get_It_Wrong
    Do_It_Again()
EndWhile


code?   If so, maybe I should just live with the problem as I'm not sure I'd ever get it right and then I could never get out of the loop  ;)

Jim