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