Download MetaTrader 5
To add comments, please log in or register
Format text in the messages editor. It is convenient!
mar
1143
mar 2015.10.26 10:05 

Hello,

I want my indicator to execute an order but I know that is only possible by a script or EA. I don't want to use an EA here and therefore the only possibility is to use a script and I read that the only method to execute a script from an indicator is by simulating a hotkey-keystroke which starts the script.

So i tried this one:

#import "user32.dll"
    void keybd_event(int bVk, int bScan, int dwFlags,int dwExtraInfo);
#import


keybd_event(0xA2, 0, 0, 0);      // press left CTRL
keybd_event(0x51, 0, 0, 0);      // press Q
keybd_event(0xA2, 0, 0x0002, 0); // release left CTRL
keybd_event(0x51, 0, 0x0002, 0); // release Q

 Unfortunately, it doesn't simulate a CTRL-Q. But why? I don't see an error here...

mar
1143
mar 2015.10.26 12:20  

I just tested it with one single keystroke and that works fine. What am I doing wrong when simulating CTRL and Q together?

This works:

#import "user32.dll"
    void keybd_event(int bVk, int bScan, int dwFlags,int dwExtraInfo);
#import
#define  VK_F9 0x78              // F9
#define  KEYEVENTF_KEYUP 0x0002  // key up

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   keybd_event(VK_F9, 0, 0, 0);
   keybd_event(VK_F9, 0, KEYEVENTF_KEYUP , 0);
  }
//+------------------------------------------------------------------+
JC
1389
JC 2015.10.26 13:01  
mar:

Unfortunately, it doesn't simulate a CTRL-Q. But why? I don't see an error here... 

The dwFlags for the first call needs to be 1 (KEYEVENTF_EXTENDEDKEY), not zero:

keybd_event(0xA2, 0, 1, 0);      // press left CTRL
keybd_event(0x51, 0, 0, 0);      // press Q
keybd_event(0xA2, 0, 0x0002, 0); // release left CTRL
keybd_event(0x51, 0, 0x0002, 0); // release Q
mar
1143
mar 2015.10.26 13:09  
Works perfect now! Thank you very much!
Ovo Cz
2957
Ovo Cz 2015.10.26 13:11  
The problem with keyboard events is that it maps a key rather than a character. So changing layout from QWERTY to AZERTY would result in a misinterpretation. If it is just for your personal use, then it is probably OK, but for distribution it might need switching to a defined layout (US Intl. layout have all).
mar
1143
mar 2015.10.26 13:25  

Thanks for that advice but this is only for my personal use.

I just noticed that there is still a bug in it. The script is executed as it should be but obviously the CTRL key is still pressed even I release it. When I press E on my keyboard normally nothing should happen but it toggles on/off the expert function. Only when I press the RIGHT CTRL key once, everything works fine again. But why?? I only simulate a left CTRL keystroke. And if I press the left CTRL key it stays active.

So it seems to me that by pressing the left CTRL key the keyboard is in a CTRL lock and it can only be released by pressing the right CTRL key. What's wrong here? 

JC
1389
JC 2015.10.26 14:39  
mar:

So it seems to me that by pressing the left CTRL key the keyboard is in a CTRL lock and it can only be released by pressing the right CTRL key. What's wrong here? 

Try altering dwFlags=2 in the last call to dwFlags=3. I haven't tried that, but it's probably the answer. (i.e. a combination of KEYEVENTF_KEYUP and KEYEVENTF_EXTENDEDKEY, matching the fact that the key-down is KEYEVENTF_EXTENDEDKEY)
JC
1389
JC 2015.10.26 14:41  
Ovo:
The problem with keyboard events is that it maps a key rather than a character. So changing layout from QWERTY to AZERTY would result in a misinterpretation. If it is just for your personal use, then it is probably OK, but for distribution it might need switching to a defined layout (US Intl. layout have all).

Well, I'll take your word for it, but the virtual key codes which this function uses should be independent of the keyboard layout. The A key should result in generation of code 0x41 regardless of whether the physical layout is QWERTY or AZERTY.

https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx 

Ovo Cz
2957
Ovo Cz 2015.10.26 15:30  
jjc:

Well, I'll take your word for it, but the virtual key codes which this function uses should be independent of the keyboard layout. The A key should result in generation of code 0x41 regardless of whether the physical layout is QWERTY or AZERTY.

https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx 

Yes, it is the 'A' key - the one next to the caps-lock. It is independent on what the layout is.
mar
1143
mar 2015.10.26 18:02  

@jjc: I changed 0x0002 to 0x0003 and it works like it should. Thanks! :)

By the way... where can I learn Win-coding-stuff like this? I googled a lot but I didn't find anything useful. 

Ovo Cz
2957
Ovo Cz 2015.10.26 18:10  
mar:

@jjc: I changed 0x0002 to 0x0003 and it works like it should. Thanks! :)

By the way... where can I learn Win-coding-stuff like this? I googled a lot but I didn't find anything useful. 

I usually rely on the Microsoft ISDN site. But this topic has probably best info here.

/ /12
To add comments, please log in or register