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
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
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
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.
Thanks...another excellent idea but unfortunately the same behavior. The cursor and focus all ends up in the right place...just no text.
Jim
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.
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
Posting some code will go a long way in helping to determine the cause.
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
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
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.
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
To continue the weirdness, this fixes the problem:
; WinActivate("~Notepad")
; SendKey("^v")
Sendmenusto('~Notepad', 'Edit Paste')
Break
Just curious, why the clipput("") line?
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
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
"hidden menu"? Create a menu with an assigned key and then hide it but it still works?
Jim
Yeah. this dialog has a menuitem control that is triggered by F7 key, generating a menu event, yet shows no menu bar:
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")
Interesting...didn't know you could define a shortcut, such as F7, in that fashion. Thanks.
Still curious about the other behavior though :)
Jim
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?
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.
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.
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
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. ;)
Is that the function Bill Murray used? Does it still contain that
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