不能向其他程序的EDIT发消息的问题(200分)

  • 主题发起人 主题发起人 llingyi
  • 开始时间 开始时间
L

llingyi

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做一个自动登陆某游戏的程序,过程是这样,向游戏登陆界面上的帐号和密码框(EDIT类)自动输入帐号和密码。我用的办法是sendmessage,发送的是sendmessage(hwnd,wm_settext,0,integer(pchar('内容'))),EDIT是密码风格的,把内容显示成*号,我发了消息后,EDIT也显示出*号,可实际上EDIT并没有得到任何内容,再手动按任意一个键,刚才EDIT里的*号全部消失。EDIT屏蔽掉了粘贴、CTRL、ALT等,我后用模拟键盘的办法keybd_event,结果和前面一样,显示出*号,可实际上没有获得任何内容,后来发现只有用手从键盘输入才能被EDIT获得,请问这是怎么回事,是方法用错了还是游戏屏蔽掉从其他进程发出的消息呢,该怎么办???另外我还用了wm_char和wm_keydown消息都不能成功,这个游戏使用了DX7,这个对向EDIT发消息有影响吗???游戏程序是不是能识别消息的来源,是别的程序发的或是键盘发的???会不会游戏对消息进行了过滤,怎么样判断有没有过滤,如果有怎么样破解掉???到底要怎么样做才能获得成功,我非常的期待,愿意献出所有的身家500分,555555,补充一点:帐号和密码框的句柄我确定是正确的,我程序找到的句柄和程序间谍spy找到的句柄验证过是相同的,我的EMAIL:llingyi@163.com
 
这个应该可以吧<br>setwindowtext(hwnd,'aaa'); //hwnd是edit的句柄
 
不行啊,密码框根本没任何反应
 
网络游戏的edit都是做了手脚的,一般人控制不了它。
 
可能遊戲裡的登陸Edit都不是用Edit做的。
 
一般的网络游戏的EDIT都控制不了。
 
我不是要读取密码,只是要写啊,应该会有底层的办法去控制的
 
我觉得你取得的edit的句柄可能不对,否则键盘能输进去,setwindowtext就能输进去
 
试试用钩子回放。
 
你用SPY++跟踪试试,看看你得到的Edit句柄是否正确,如果正确setwindowtext一般都能输进去
 
try this unit:<br>unit hkSend;<br><br>interface<br><br>uses<br>&nbsp; SysUtils,<br>&nbsp; Messages,<br>&nbsp; Forms,<br>&nbsp; Windows,<br>&nbsp; Classes;<br><br>type<br>&nbsp; TSendKeyError = (skNone, skFailSetHook, skInvalidToken, skUnknownError);<br><br>function SendKeys(S: String; Wait: Boolean): TSendKeyError;<br><br>implementation<br><br>type<br>&nbsp; ESendKeyError = class(Exception);<br>&nbsp; ESetHookError = class(ESendKeyError);<br>&nbsp; EInvalidToken = class(ESendKeyError);<br><br>&nbsp; TKeyDef = record<br>&nbsp; &nbsp; Key : String;<br>&nbsp; &nbsp; Code: UINT;<br>&nbsp; end;<br><br>&nbsp; TMessageList = class(TList)<br>&nbsp; public<br>&nbsp; &nbsp; destructor Destroy; override;<br>&nbsp; end;<br><br>const<br>&nbsp; MaxKeys = 43;<br>&nbsp; ShiftKey = '+';<br>&nbsp; ControlKey = '^';<br>&nbsp; AltKey = '%';<br>&nbsp; EnterKey = '~';<br><br>&nbsp; KeyGroupOpen = '{';<br>&nbsp; KeyGroupClose = '}';<br><br>&nbsp; KeyTokens = '{}~%^+';<br><br>&nbsp; KeyDefs : array[1..MaxKeys] of TKeyDef = (<br>&nbsp; &nbsp;(Key: 'BACKSPACE' &nbsp;; Code: VK_BACK),<br>&nbsp; &nbsp;(Key: 'BKSP' &nbsp; &nbsp; &nbsp; ; Code: VK_BACK),<br>&nbsp; &nbsp;(Key: 'BS' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_BACK),<br>&nbsp; &nbsp;(Key: 'CAPS' &nbsp; &nbsp; &nbsp; ; Code: VK_CAPITAL),<br>&nbsp; &nbsp;(Key: 'CAPSLOCK' &nbsp; ; Code: VK_CAPITAL),<br>&nbsp; &nbsp;(KEy: 'CLEAR' &nbsp; &nbsp; &nbsp;; Code: VK_CLEAR),<br>&nbsp; &nbsp;(Key: 'DEL' &nbsp; &nbsp; &nbsp; &nbsp;; Code: VK_DELETE),<br>&nbsp; &nbsp;(Key: 'DELETE' &nbsp; &nbsp; ; Code: VK_DELETE),<br>&nbsp; &nbsp;(Key: 'DOWN' &nbsp; &nbsp; &nbsp; ; Code: VK_DOWN),<br>&nbsp; &nbsp;(Key: 'END' &nbsp; &nbsp; &nbsp; &nbsp;; Code: VK_END),<br>&nbsp; &nbsp;(Key: 'ENTER' &nbsp; &nbsp; &nbsp;; Code: VK_RETURN),<br>&nbsp; &nbsp;(Key: 'ESC' &nbsp; &nbsp; &nbsp; &nbsp;; Code: VK_ESCAPE),<br>&nbsp; &nbsp;(Key: 'ESCAPE' &nbsp; &nbsp; ; Code: VK_ESCAPE),<br>&nbsp; &nbsp;(Key: 'HOME' &nbsp; &nbsp; &nbsp; ; Code: VK_HOME),<br>&nbsp; &nbsp;(Key: 'INS' &nbsp; &nbsp; &nbsp; &nbsp;; Code: VK_INSERT),<br>&nbsp; &nbsp;(Key: 'INSERT' &nbsp; &nbsp; ; Code: VK_INSERT),<br>&nbsp; &nbsp;(Key: 'LEFT' &nbsp; &nbsp; &nbsp; ; Code: VK_LEFT),<br>&nbsp; &nbsp;(Key: 'NUM' &nbsp; &nbsp; &nbsp; &nbsp;; Code: VK_NUMLOCK),<br>&nbsp; &nbsp;(Key: 'NUMLOCK' &nbsp; &nbsp;; Code: VK_NUMLOCK),<br>&nbsp; &nbsp;(Key: 'DOWN' &nbsp; &nbsp; &nbsp; ; Code: VK_DOWN),<br>&nbsp; &nbsp;(Key: 'PAGEDOWN' &nbsp; ; Code: VK_NEXT),<br>&nbsp; &nbsp;(Key: 'PGDN' &nbsp; &nbsp; &nbsp; ; Code: VK_NEXT),<br>&nbsp; &nbsp;(Key: 'PAGEUP' &nbsp; &nbsp; ; Code: VK_PRIOR),<br>&nbsp; &nbsp;(Key: 'PGUP' &nbsp; &nbsp; &nbsp; ; Code: VK_PRIOR),<br>&nbsp; &nbsp;(Key: 'RIGHT' &nbsp; &nbsp; &nbsp;; Code: VK_RIGHT),<br>&nbsp; &nbsp;(Key: 'SCROLL' &nbsp; &nbsp; ; Code: VK_SCROLL),<br>&nbsp; &nbsp;(Key: 'SCROLLLOCK' ; Code: VK_SCROLL),<br>&nbsp; &nbsp;(Key: 'PRINTSCREEN'; Code: VK_SNAPSHOT),<br>&nbsp; &nbsp;(Key: 'PRTSC' &nbsp; &nbsp; &nbsp;; Code: VK_SNAPSHOT),<br>&nbsp; &nbsp;(Key: 'TAB' &nbsp; &nbsp; &nbsp; &nbsp;; Code: VK_TAB),<br>&nbsp; &nbsp;(Key: 'UP' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_UP),<br>&nbsp; &nbsp;(Key: 'F1' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_F1),<br>&nbsp; &nbsp;(Key: 'F2' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_F2),<br>&nbsp; &nbsp;(Key: 'F3' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_F3),<br>&nbsp; &nbsp;(Key: 'F4' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_F4),<br>&nbsp; &nbsp;(Key: 'F5' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_F5),<br>&nbsp; &nbsp;(Key: 'F6' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_F6),<br>&nbsp; &nbsp;(Key: 'F7' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_F7),<br>&nbsp; &nbsp;(Key: 'F8' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_F8),<br>&nbsp; &nbsp;(Key: 'F9' &nbsp; &nbsp; &nbsp; &nbsp; ; Code: VK_F9),<br>&nbsp; &nbsp;(Key: 'F10' &nbsp; &nbsp; &nbsp; &nbsp;; Code: VK_F10),<br>&nbsp; &nbsp;(Key: 'F11' &nbsp; &nbsp; &nbsp; &nbsp;; Code: VK_F11),<br>&nbsp; &nbsp;(Key: 'F12' &nbsp; &nbsp; &nbsp; &nbsp;; Code: VK_F12));<br><br>var<br>&nbsp; bPlaying,<br>&nbsp; bAltPressed,<br>&nbsp; bControlPressed,<br>&nbsp; bShiftPressed &nbsp; &nbsp;: Boolean;<br>&nbsp; Delay, CurDelay &nbsp;: Integer;<br>&nbsp; Event &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: TEventMsg;<br>&nbsp; MessageList &nbsp; &nbsp; &nbsp;: TMessageList;<br>&nbsp; iMsgCount &nbsp; &nbsp; &nbsp; &nbsp;: Integer;<br>&nbsp; HookHandle &nbsp; &nbsp; &nbsp; : hHook;<br><br>destructor TMessageList.Destroy;<br>var<br>&nbsp; i : Integer;<br>begin<br>&nbsp; for i:=0 to Count-1 do<br>&nbsp; &nbsp;Dispose(PEventMsg(Items));<br>&nbsp; inherited;<br>end;<br><br>procedure StopPlayback;<br>begin<br>&nbsp; if bPlaying then UnhookWindowsHookEx(HookHandle);<br>&nbsp; MessageList.Free;<br>&nbsp; bPlaying := False;<br>end;<br><br>function Playback(nCode: Integer; wp: wParam; lp: lParam): Longint; stdcall; export;<br>begin<br>&nbsp; Result := 0;<br>&nbsp; case nCode of<br>&nbsp; &nbsp; HC_SKIP:<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp;inc(iMsgCount);<br>&nbsp; &nbsp; &nbsp; &nbsp;if iMsgCount&gt;=MessageList.Count then<br>&nbsp; &nbsp; &nbsp; &nbsp; StopPlayback<br>&nbsp; &nbsp; &nbsp; &nbsp;else<br>&nbsp; &nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Event := TEventMsg(MessageList.Items[iMsgCount]^);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CurDelay := Delay;<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp; &nbsp; HC_GETNEXT:<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp;with PEventMsg(lp)^ do<br>&nbsp; &nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Message := Event.Message;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ParamL &nbsp;:= Event.ParamL;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ParamH &nbsp;:= Event.ParamH;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Time &nbsp; &nbsp;:= Event.Time;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hWnd &nbsp; &nbsp;:= Event.hWnd;<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp; &nbsp; Result := CurDelay;<br>&nbsp; &nbsp; &nbsp; &nbsp; CurDelay := 0;<br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp;Result := CallNextHookEx(HookHandle, nCode, wp, lp);<br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp; end;<br>end;<br><br>procedure StartPlayback;<br>begin<br>&nbsp; Event := TEventMsg(MessageList.Items[0]^);<br>&nbsp; iMsgCount := 0;<br>&nbsp; HookHandle := SetWindowsHookEx(WH_JOURNALPLAYBACK, @Playback, hInstance, 0);<br>&nbsp; if HookHandle=0 then<br>&nbsp; &nbsp;raise ESetHookError.Create('Could not set hook')<br>&nbsp; else<br>&nbsp; &nbsp;bPlaying := True;<br>end;<br><br>procedure MakeMessage(vKey, M: UINT);<br>var<br>&nbsp; E: PEventMsg;<br>begin<br>&nbsp; New(E);<br>&nbsp; with E^ do<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;Message := M;<br>&nbsp; &nbsp; &nbsp;ParamL &nbsp;:= vKey;<br>&nbsp; &nbsp; &nbsp;ParamH &nbsp;:= MapVirtualKey(vKey, 0);<br>&nbsp; &nbsp; &nbsp;Time &nbsp; &nbsp;:= GetTickCount;<br>&nbsp; &nbsp; &nbsp;hWnd &nbsp; &nbsp;:= 0;<br>&nbsp; &nbsp;end;<br>&nbsp; MessageList.Add(E);<br>end;<br><br>function FindKeyInArray(Key: String; var Code: UINT): Boolean;<br>var<br>&nbsp; i : Integer;<br>begin<br>&nbsp; Result := False;<br>&nbsp; for i:=Low(KeyDefs) to High(KeyDefs) do<br>&nbsp; &nbsp;if UpperCase(Key)=KeyDefs.Key then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; Code := KeyDefs.Code;<br>&nbsp; &nbsp; &nbsp; Result := True;<br>&nbsp; &nbsp; &nbsp; Exit;<br>&nbsp; &nbsp; end;<br>end;<br><br>const<br>&nbsp; vkKeySet = [VK_SPACE, Ord('A')..Ord('Z'), VK_MENU, VK_F1..VK_F12];<br><br>procedure SimulateKey(Code: UINT; Down: Boolean);<br>const<br>&nbsp; KeyMsg: array[Boolean] of UINT = (WM_KEYUP, WM_KEYDOWN);<br>&nbsp; SysMsg: array[Boolean] of UINT = (WM_SYSKEYUP, WM_SYSKEYDOWN);<br>begin<br>&nbsp; if bAltPressed and (not bControlPressed) and (Code in vkKeySet) then<br>&nbsp; &nbsp;MakeMessage(Code, SysMsg[Down])<br>&nbsp; else<br>&nbsp; &nbsp;MakeMessage(Code, KeyMsg[Down])<br>end;<br><br>procedure SimulateKeyPress(Code: UINT);<br>begin<br>&nbsp; if bAltPressed then SimulateKey(VK_MENU, True);<br>&nbsp; if bControlPressed then SimulateKey(VK_CONTROL, True);<br>&nbsp; if bShiftPressed and not bControlPressed then SimulateKey(VK_SHIFT, True);<br>&nbsp; SimulateKey(Code, True);<br>&nbsp; SimulateKey(Code, False);<br>&nbsp; if bShiftPressed and not bControlPressed then<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;SimulateKey(VK_SHIFT, False);<br>&nbsp; &nbsp; &nbsp;bShiftPressed := False;<br>&nbsp; &nbsp;end;<br>&nbsp; if bControlPressed then<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;SimulateKey(VK_CONTROL, False);<br>&nbsp; &nbsp; &nbsp;bControlPressed := False;<br>&nbsp; &nbsp;end;<br>&nbsp; if bAltPressed then<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;SimulateKey(VK_MENU, False);<br>&nbsp; &nbsp; &nbsp;bAltPressed := False;<br>&nbsp; &nbsp;end;<br>end;<br><br>procedure NormalKeyPress(C: Char);<br>var<br>&nbsp; KeyCode,<br>&nbsp; Shift &nbsp;: UINT;<br>begin<br>&nbsp; KeyCode := vkKeyScan(C);<br>&nbsp; Shift := HiByte(KeyCode);<br>&nbsp; if (Shift and 1)=1 then bShiftPressed := True;<br>&nbsp; if (Shift and 2)=2 then bControlPressed := True;<br>&nbsp; if (Shift and 4)=4 then bAltPressed := True;<br>&nbsp; SimulateKeyPress(LoByte(KeyCode))<br>end;<br><br>function CheckDelay(Token: String): Boolean;<br>begin<br>&nbsp; Token := UpperCase(Token);<br>&nbsp; Result := Pos('DELAY', Token)=1;<br>&nbsp; if Result then<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;Delete(Token, 1, 5);<br>&nbsp; &nbsp; &nbsp;if (Length(Token)&gt;0) and (Token[1]='=') then Delete(Token, 1, 1);<br>&nbsp; &nbsp; &nbsp;Delay := StrToIntDef(Token, 0);<br>&nbsp; &nbsp;end;<br>end;<br><br>procedure ProcessKey(S: String);<br>var<br>&nbsp; Index &nbsp;: Integer;<br>&nbsp; Token &nbsp;: String;<br>&nbsp; KeyCode: UINT;<br>begin<br>&nbsp; Index := 1;<br>&nbsp; repeat<br>&nbsp; &nbsp; case S[Index] of<br>&nbsp; &nbsp; &nbsp; KeyGroupOpen:<br>&nbsp; &nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Token := '';<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(Index);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (Index&lt;Length(S)) and (S[Index]&lt;&gt;KeyGroupClose) do<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Token := Token + S[Index];<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inc(Index);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (Length(Token)=12) and (S[Index]&lt;&gt;KeyGroupClose) then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;raise EInvalidToken.Create('No closing brace')<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (Length(Token)=1) and (Pos(Token, KeyTokens)&gt;0) then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NormalKeyPress(Token[1])<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else if FindKeyInArray(Token, KeyCode) then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SimulateKeyPress(KeyCode)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else if not CheckDelay(Token) then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; raise EInvalidToken.Create('Invalid token');<br>&nbsp; &nbsp; &nbsp; &nbsp;end;<br>&nbsp; &nbsp; &nbsp; AltKey:<br>&nbsp; &nbsp; &nbsp; &nbsp;bAltPressed := True;<br>&nbsp; &nbsp; &nbsp; ControlKey:<br>&nbsp; &nbsp; &nbsp; &nbsp;bControlPressed := True;<br>&nbsp; &nbsp; &nbsp; ShiftKey:<br>&nbsp; &nbsp; &nbsp; &nbsp;bShiftPressed := True;<br>&nbsp; &nbsp; &nbsp; EnterKey:<br>&nbsp; &nbsp; &nbsp; &nbsp;SimulateKeyPress(VK_RETURN);<br>&nbsp; &nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; &nbsp;NormalKeyPress(S[Index]);<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; inc(Index);<br>&nbsp; until Index &gt; Length(S);<br>end;<br><br>function SendKeys(S: String; Wait: Boolean): TSendKeyError;<br>begin<br>&nbsp; bAltPressed := False;<br>&nbsp; bControlPressed := False;<br>&nbsp; bShiftPressed := False;<br>&nbsp; Result := skNone;<br>&nbsp; Delay := 0;<br>&nbsp; if bPlaying or (S='') then Exit;<br>&nbsp; try<br>&nbsp; &nbsp; MessageList := TMessageList.Create;<br>&nbsp; &nbsp; ProcessKey(S);<br>&nbsp; &nbsp; StartPlayback;<br>&nbsp; &nbsp; if Wait then<br>&nbsp; &nbsp; &nbsp;repeat<br>&nbsp; &nbsp; &nbsp; &nbsp;Application.ProcessMessages;<br>&nbsp; &nbsp; &nbsp;until bPlaying = False;<br>&nbsp; except<br>&nbsp; &nbsp;on E:ESendKeyError do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; MessageList.Free;<br>&nbsp; &nbsp; &nbsp; if E is ESetHookError then<br>&nbsp; &nbsp; &nbsp; &nbsp;Result := skFailSetHook<br>&nbsp; &nbsp; &nbsp; else if E is EInvalidToken then<br>&nbsp; &nbsp; &nbsp; &nbsp;Result := skInvalidToken;<br>&nbsp; &nbsp; end<br>&nbsp; &nbsp;else<br>&nbsp; &nbsp; Result := skUnknownError;<br>&nbsp; end;<br>end;<br><br>end.
 
weiwei81123:<br>你这个程序怎么用啊,能不能解释一下
 
刚才试了一下,密码输入到了密码框里,但是登陆游戏时,报密码错误
 
这个单元定义了几个一些特殊的字符来表示功能键(详见代码),如果要发送以下几个字符:<br>'+','^','%','~','{'<br>请将它们用'{'和'}'括起来<br>或者你修改一下,将相关的处理去掉也成
 
发送过去的密码还是不正确啊,这是不是编码错误呀???
 
怀疑与CAPSLOCK有关,测试了一下,原来在CAPSLOCK打开的时候发送字母的大小写反了<br>这应该是造成问题的原因,不知道有没有办法判断,能的话加一个{CAPS}就行了
 
我的密码都是小写,运行程序的时候,CAPSLOCK是关闭的,到底问题在哪呀,我怀疑是游戏加入了消息发送者身份的判断,一旦检测是其他程序而不是键盘发来的字符,就不接收
 
本人看了一本DELPHI的书,如果程序是从EDIT类继承过来的,那么将没有办法获得焦点,同时将没办法输入,估计游戏是把键盘的东西过滤后,模拟了输入的
 
后退
顶部