jiglei Posted February 28, 2010 Share Posted February 28, 2010 Hello everyone. I've been looking for an alternate way to send keys to a window rather than controlsend(), which doesn't satisfy my needs, as it makes the window go in front instead of making it be hidden or minimized and then send keys, which is a trouble for what I intend to do. Anyways, I've been able to find this useful function made by someone, here in this forums, and I've even added some codes to it that are needed for my uses: expandcollapse popupGlobal Const $VK_OEM_PLUS = 0xBB Global Const $VK_OEM_MINUS = 0xBD Global Const $VK_OEM_3 = 0xC0 Global Const $VK_TAB = 0x9 Global Const $VK_ESC = 0x1B Global Const $VK_F5 = 0x74 Global Const $VK_F12 = 0x7B Global Const $VK_Period = 0x6E Global Const $VK_SEMICOLON = 0xBA Global Const $VK_COLON = 0x3A Func _MakeLong($LoWord, $HiWord) Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF)) EndFunc Func _MouseClick($hWnd, $button, $x, $y, $times = 1, $delay = 0) Local $ret, $ix $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x200, "int", 0, "long", _MakeLong($x, $y)) If $ret[0] = 0 Then SetError(-1) Return EndIf $button = StringLower($button) If $button = "left" Then For $ix = 1 To $times $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x201, "int", 1, "long", _MakeLong($x, $y)) If $ret[0] = 0 Then SetError(-2) Return Else $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x202, "int", 0, "long", _MakeLong($x, $y)) If $ret[0] = 0 Then SetError(-3) Return EndIf EndIf Sleep($delay) Next ElseIf $button = "right" Then For $ix = 1 To $times $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x204, "int", 2, "long", _MakeLong($x, $y)) If $ret[0] = 0 Then SetError(-4) Return Else $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x205, "int", 0, "long", _MakeLong($x, $y)) If $ret[0] = 0 Then SetError(-5) Return EndIf EndIf Sleep($delay) Next Else SetError(-6) Return EndIf EndFunc Func _SendKeys($hWnd, $keys) If $hWnd <= 0 Or StringLen($keys) = 0 Then SetError(-1) Return False EndIf $keys = StringUpper($keys) $keys = StringReplace($keys, "`", Chr($VK_OEM_3)) $keys = StringReplace($keys, "~", Chr($VK_OEM_3)) $keys = StringReplace($keys, "-", Chr($VK_OEM_MINUS)) $keys = StringReplace($keys, "=", Chr($VK_OEM_PLUS)) $keys = StringReplace($keys, "{ENTER}", Chr(0xD)) $keys = StringReplace($keys, "{LCTRL}", Chr(0xA2)) $keys = StringReplace($keys, "{F1}", Chr(0x70)) $keys = StringReplace($keys, "{F2}", Chr(0x71)) $keys = StringReplace($keys, "{F3}", Chr(0x72)) $keys = StringReplace($keys, "{F4}", Chr(0x73)) $keys = StringReplace($keys, "{TAB}", Chr(0x9)) $keys = StringReplace($keys, "{ESC}", Chr($VK_ESC)) $keys = StringReplace($keys, "{F5}", Chr($VK_F5)) $keys = StringReplace($keys, "{F12}", Chr($VK_F12)) $keys = StringReplace($keys, "{SHIFT}", "+") $keys = StringReplace($keys, ".", Chr($VK_Period)) $keys = StringReplace($keys, ";", Chr($VK_SEMICOLON)) ;$keys = StringReplace($keys, ":", chr($VK_SEMICOLON)) Local $i, $ret Local $shiftdown = False For $i = 1 To StringLen($keys) If StringMid($keys, $i, 1) = "+" Then DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", 0x10, "long", 0x002A0001) DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", 0x10, "long", 0x402A0001) $shiftdown = True Sleep(1) ContinueLoop Else $ret = DllCall("user32.dll", "int", "MapVirtualKey", "int", Asc(StringMid($keys, $i, 1)), "int", 0) If IsArray($ret) Then DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", Asc(StringMid($keys, $i, 1)), "long", _MakeLong(1, $ret[0])) Sleep(1) DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x101, "int", Asc(StringMid($keys, $i, 1)), "long", _MakeLong(1, $ret[0]) + 0xC0000000) EndIf EndIf If $shiftdown Then Sleep(1) DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x101, "int", 0x10, "long", 0xC02A0001) $shiftdown = False EndIf Next Return True EndFunc Func _ArrowKey($hWnd, $key) If $hWnd <= 0 Or ($key <> "left" And $key <> "right" And $key <> "up" And $key <> "down") Then SetError(-1) Return EndIf Local $wParam, $lParam, $ret If $key = "left" Then $wParam = 0x25 $lParam = 0x14B0001 ElseIf $key = "right" Then $wParam = 0x27 $lParam = 0x14D0001 ElseIf $key = "down" Then $wParam = 0x28 $lParam = 0x1500001 ElseIf $key = "up" Then $wParam = 0x26 $lParam = 0x1480001 EndIf $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", $wParam, "int", $lParam) If $ret[0] = 0 Then MsgBox(16, "_ArrowKey Error", "There was an error posting the WM_KEYDOWN message") SetError(-2) Return EndIf Sleep(2) $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x101, "int", $wParam, "int", ($lParam + 0xC0000000)) If $ret[0] = 0 Then MsgBox(16, "_ArrowKey Error", "There was an error posting the WM_KEYUP message") SetError(-3) Return EndIf EndFunc Altought, I need to send a combination of keys, just like ctrl + x (where x would be any key). I have no idea how to do it, I tried to combine the hex codes of ctrl and the key that I would want with BitAnd and BitOr, which didn't work. I've also searched for hex tables that would contain such information, but didn't, best I found was Alt+A stuff, but I need with ctrl... :S The codes I actualy need would be: Ctrl + 1 ctrl + 2 ctrl +3 ctrl +4 ctrl +5 ctrl +6 ctrl +7 ctrl +8 ctrl +9 and ctrl+0 Not the numpad codes, which wouldn't work. So, if someone can point me a way to get those codes, or to actualy give me them, I would appreciate. If you need more details on what I need, just ask, but I think I've been very clear on what I want. Thanks in advance, regards, jiglei. Link to comment Share on other sites More sharing options...
JRowe Posted February 28, 2010 Share Posted February 28, 2010 (edited) edit: nm, I see what you're asking. The hex codes are ascii. Edited February 28, 2010 by JRowe [center]However, like ninjas, cyber warriors operate in silence.AutoIt Chat Engine (+Chatbot) , Link Grammar for AutoIt , Simple Speech RecognitionArtificial Neural Networks UDF , Bayesian Networks UDF , Pattern Matching UDFTransparent PNG GUI Elements , Au3Irrlicht 2Advanced Mouse Events MonitorGrammar Database GeneratorTransitions & Tweening UDFPoker Hand Evaluator[/center] Link to comment Share on other sites More sharing options...
jiglei Posted February 28, 2010 Author Share Posted February 28, 2010 No, I actualy mean the hex codes for each key like theese: Global Const $VK_OEM_PLUS = 0xBB Global Const $VK_OEM_MINUS = 0xBD Global Const $VK_OEM_3 = 0xC0 Global Const $VK_TAB = 0x9 Global Const $VK_ESC = 0x1B Global Const $VK_F5 = 0x74 Global Const $VK_F12 = 0x7B Global Const $VK_Period = 0x6E Global Const $VK_SEMICOLON = 0xBA Global Const $VK_COLON = 0x3A For F1 to F4 I found out that the code is 0x70 to 0x73 And for LCTRL i found that its 0xA2 . Function works fine sending those keys and regular key strokes of "1" "hello" and sort of. But I need someway to send a combination of keys in a single stroke, Like ctrl + 1 for example On send() function, I simply had to do Send("^1") and it would work. But on this one, I guess I would need some special hex code that would either be the ctrl +1 stroke (for example) or the ctrl down, then 1, then control up. Something like that... SO, any ideas? Link to comment Share on other sites More sharing options...
JRowe Posted February 28, 2010 Share Posted February 28, 2010 http://en.wikipedia.org/wiki/ASCII There's your hex values. Dunno about the rest. [center]However, like ninjas, cyber warriors operate in silence.AutoIt Chat Engine (+Chatbot) , Link Grammar for AutoIt , Simple Speech RecognitionArtificial Neural Networks UDF , Bayesian Networks UDF , Pattern Matching UDFTransparent PNG GUI Elements , Au3Irrlicht 2Advanced Mouse Events MonitorGrammar Database GeneratorTransitions & Tweening UDFPoker Hand Evaluator[/center] Link to comment Share on other sites More sharing options...
jiglei Posted February 28, 2010 Author Share Posted February 28, 2010 I had already searched that page... Hadn't found what I wanted there... :S Seems to be very specific what I need... But I would bet anything that its possible. Just need to know how ... Thanks for your help anyway JRowe. Link to comment Share on other sites More sharing options...
jiglei Posted March 3, 2010 Author Share Posted March 3, 2010 Bump. Sorry, but I need help on this :/ Can't somebody really help me out? Link to comment Share on other sites More sharing options...
soadmania Posted May 22, 2010 Share Posted May 22, 2010 I have the same problem. Can anyone help us please? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now