求如何向指定窗口 发出键盘指令 能给个实例最好 谢谢(200)

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

laijf

Unregistered / Unconfirmed
GUEST, unregistred user!
求如何向指定窗口 发出键盘指令 能给个实例最好 谢谢
 
其中有个MB_DEFBUTTON2表示设置默认按钮。 对memo控件翻页:SendMessage(Memo.Handle,WM_KeyDown,VK_Next,0)其它类似。
 
朋友 能说仔细点吗?有实例吗?我是菜鸟级别 没看懂你说的
 
d5光盘中的unit USendkeys;//使用案例: SendKeys(Edit1, 'abc123{left}{left}{left}def{end}456{left 6}ghi{end}789', True);interfaceuses windows, messages, sysutils, Controls;function SendKeys(AWinCon: TWincontrol; SendKeysString: PChar; Wait: Boolean): Boolean;implementationfunction SendKeys(AWinCon: TWincontrol; SendKeysString: PChar; Wait: Boolean): Boolean;type WBytes = array[0..pred(SizeOf(Word))] of Byte; TSendKey = record Name: ShortString; VKey: Byte; end;const MaxSendKeyRecs = 41; SendKeyRecs: array[1..MaxSendKeyRecs] of TSendKey = ( (Name: 'BACKSPACE'; VKey: VK_BACK), (Name: 'BKSP'; VKey: VK_BACK), (Name: 'BREAK'; VKey: VK_CANCEL), (Name: 'BS'; VKey: VK_BACK), (Name: 'CAPSLOCK'; VKey: VK_CAPITAL), (Name: 'CLEAR'; VKey: VK_CLEAR), (Name: 'DEL'; VKey: VK_DELETE), (Name: 'DELETE'; VKey: VK_DELETE), (Name: 'DOWN'; VKey: VK_DOWN), (Name: 'END'; VKey: VK_END), (Name: 'ENTER'; VKey: VK_RETURN), (Name: 'ESC'; VKey: VK_ESCAPE), (Name: 'ESCAPE'; VKey: VK_ESCAPE), (Name: 'F1'; VKey: VK_F1), (Name: 'F10'; VKey: VK_F10), (Name: 'F11'; VKey: VK_F11), (Name: 'F12'; VKey: VK_F12), (Name: 'F13'; VKey: VK_F13), (Name: 'F14'; VKey: VK_F14), (Name: 'F15'; VKey: VK_F15), (Name: 'F16'; VKey: VK_F16), (Name: 'F2'; VKey: VK_F2), (Name: 'F3'; VKey: VK_F3), (Name: 'F4'; VKey: VK_F4), (Name: 'F5'; VKey: VK_F5), (Name: 'F6'; VKey: VK_F6), (Name: 'F7'; VKey: VK_F7), (Name: 'F8'; VKey: VK_F8), (Name: 'F9'; VKey: VK_F9), (Name: 'HELP'; VKey: VK_HELP), (Name: 'HOME'; VKey: VK_HOME), (Name: 'INS'; VKey: VK_INSERT), (Name: 'LEFT'; VKey: VK_LEFT), (Name: 'NUMLOCK'; VKey: VK_NUMLOCK), (Name: 'PGDN'; VKey: VK_NEXT), (Name: 'PGUP'; VKey: VK_PRIOR), (Name: 'PRTSC'; VKey: VK_PRINT), (Name: 'RIGHT'; VKey: VK_RIGHT), (Name: 'SCROLLLOCK'; VKey: VK_SCROLL), (Name: 'TAB'; VKey: VK_TAB), (Name: 'UP'; VKey: VK_UP) ); VK_NULL = 0; VK_SemiColon = 186; VK_Equal = 187; VK_Comma = 188; VK_Minus = 189; VK_Period = 190; VK_Slash = 191; VK_BackQuote = 192; VK_LeftBracket = 219; VK_BackSlash = 220; VK_RightBracket = 221; VK_Quote = 222; VK_Last = VK_Quote; ExtendedVKeys: set of byte = [VK_Up, VK_Down, VK_Left, VK_Right, VK_Home, VK_End, VK_Prior, {PgUp} VK_Next, {PgDn} VK_Insert, VK_Delete];const INVALIDKEY = $FFFF; VKKEYSCANSHIFTON = $01; VKKEYSCANCTRLON = $02; VKKEYSCANALTON = $04; UNITNAME = 'SendKeys';var UsingParens, ShiftDown, ControlDown, AltDown, FoundClose: Boolean; PosSpace: Byte; I, L: Integer; NumTimes, MKey: Word; KeyString: string[20]; AllocationSize: Integer; procedure DisplayMessage(Message: PChar); begin MessageBox(0, Message, UNITNAME, 0); end; function BitSet(BitTable, BitMask: Byte): Boolean; begin Result := ByteBool(BitTable and BitMask); end; procedure SetBit(var BitTable: Byte; BitMask: Byte); begin BitTable := BitTable or Bitmask; end; procedure KeyboardEvent(VKey, ScanCode: Byte; Flags: Longint); var KeyboardMsg: TMsg; begin keybd_event(VKey, ScanCode, Flags, 0); if (Wait) then while (PeekMessage(KeyboardMsg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)) do begin TranslateMessage(KeyboardMsg); DispatchMessage(KeyboardMsg); end; end; procedure SendKeyDown(VKey: Byte; NumTimes: Word; GenUpMsg: Boolean); var Cnt: Word; ScanCode: Byte; NumState: Boolean; KeyBoardState: TKeyboardState; begin if (VKey = VK_NUMLOCK) then begin NumState := ByteBool(GetKeyState(VK_NUMLOCK) and 1); GetKeyBoardState(KeyBoardState); if NumState then KeyBoardState[VK_NUMLOCK] := (KeyBoardState[VK_NUMLOCK] and not 1) else KeyBoardState[VK_NUMLOCK] := (KeyBoardState[VK_NUMLOCK] or 1); SetKeyBoardState(KeyBoardState); exit; end; ScanCode := Lo(MapVirtualKey(VKey, 0)); for Cnt := 1 to NumTimes do if (VKey in ExtendedVKeys) then begin KeyboardEvent(VKey, ScanCode, KEYEVENTF_EXTENDEDKEY); if (GenUpMsg) then KeyboardEvent(VKey, ScanCode, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP) end else begin KeyboardEvent(VKey, ScanCode, 0); if (GenUpMsg) then KeyboardEvent(VKey, ScanCode, KEYEVENTF_KEYUP); end; end; procedure SendKeyUp(VKey: Byte); var ScanCode: Byte; begin ScanCode := Lo(MapVirtualKey(VKey, 0)); if (VKey in ExtendedVKeys) then KeyboardEvent(VKey, ScanCode, KEYEVENTF_EXTENDEDKEY and KEYEVENTF_KEYUP) else KeyboardEvent(VKey, ScanCode, KEYEVENTF_KEYUP); end; procedure SendKey(MKey: Word; NumTimes: Word; GenDownMsg: Boolean); var bShift: boolean; begin //'A'=65+256=321 'Z'=90+256=346 需要考虑当前键盘Caps lock状态 //'a'=65 'z'=90 if (MKey >= 321) and (MKey <= 346) and ((GetKeyState(VK_CAPITAL) and $01) > 0) then bShift := false else if (MKey >= 65) and (MKey <= 90) and ((GetKeyState(VK_CAPITAL) and $01) > 0) then bShift := true else bShift := (BitSet(Hi(MKey), VKKEYSCANSHIFTON)); if bShift then SendKeyDown(VK_SHIFT, 1, False); if (BitSet(Hi(MKey), VKKEYSCANCTRLON)) then SendKeyDown(VK_CONTROL, 1, False); if (BitSet(Hi(MKey), VKKEYSCANALTON)) then SendKeyDown(VK_MENU, 1, False); // SendKeyDown(Lo(MKey), NumTimes, GenDownMsg); //输入法有效时,该命令将按键消息发送给了输入法程序 PostMessage(AWinCon.Handle, WM_KEYDOWN, MKey, 1); //lParam表示按键次数 if bShift then SendKeyUp(VK_SHIFT); if (BitSet(Hi(MKey), VKKEYSCANCTRLON)) then SendKeyUp(VK_CONTROL); if (BitSet(Hi(MKey), VKKEYSCANALTON)) then SendKeyUp(VK_MENU); end; function StringToVKey(KeyString: ShortString): Word; var Found, Collided: Boolean; Bottom, Top, Middle: Byte; begin Result := INVALIDKEY; Bottom := 1; Top := MaxSendKeyRecs; Found := false; Middle := (Bottom + Top) div 2; repeat Collided := ((Bottom = Middle) or (Top = Middle)); if (KeyString = SendKeyRecs[Middle].Name) then begin Found := True; Result := SendKeyRecs[Middle].VKey; end else begin if (KeyString > SendKeyRecs[Middle].Name) then Bottom := Middle else Top := Middle; Middle := (Succ(Bottom + Top)) div 2; end; until (Found or Collided); if (Result = INVALIDKEY) then DisplayMessage('Invalid Key Name'); end; procedure PopUpShiftKeys; begin if (not UsingParens) then begin if ShiftDown then SendKeyUp(VK_SHIFT); if ControlDown then SendKeyUp(VK_CONTROL); if AltDown then SendKeyUp(VK_MENU); ShiftDown := false; ControlDown := false; AltDown := false; end; end;begin Result := false; if AWinCon = nil then exit; Windows.SetFocus(AWinCon.Handle); AllocationSize := MaxInt; Result := false; UsingParens := false; ShiftDown := false; ControlDown := false; AltDown := false; I := 0; L := StrLen(SendKeysString); if (L > AllocationSize) then L := AllocationSize; if (L = 0) then Exit; while (I < L) do begin case SendKeysString of '{': begin NumTimes := 1; if (SendKeysString[Succ(I)] = '{') then begin MKey := VK_LEFTBRACKET; SetBit(Wbytes(MKey)[1], VKKEYSCANSHIFTON); SendKey(MKey, 1, True); PopUpShiftKeys; Inc(I, 3); Continue; end; KeyString := ''; FoundClose := False; while (I <= L) do begin Inc(I); if (SendKeysString = '}') then begin FoundClose := True; Inc(I); Break; end; KeyString := KeyString + Upcase(SendKeysString); end; if (not FoundClose) then begin DisplayMessage('No Close'); Exit; end; if (SendKeysString = '}') then begin MKey := VK_RIGHTBRACKET; SetBit(Wbytes(MKey)[1], VKKEYSCANSHIFTON); SendKey(MKey, 1, True); PopUpShiftKeys; Inc(I); Continue; end; PosSpace := Pos(' ', KeyString); if (PosSpace <> 0) then begin NumTimes := StrToInt(Copy(KeyString, Succ(PosSpace), Length(KeyString) - PosSpace)); KeyString := Copy(KeyString, 1, Pred(PosSpace)); end; if (Length(KeyString) = 1) then MKey := vkKeyScan(KeyString[1]) else MKey := StringToVKey(KeyString); if (MKey <> INVALIDKEY) then begin SendKey(MKey, NumTimes, True); PopUpShiftKeys; Continue; end; end; '~': begin SendKeyDown(VK_RETURN, 1, True); PopUpShiftKeys; Inc(I); end; else begin MKey := vkKeyScan(SendKeysString); if (MKey <> INVALIDKEY) then begin SendKey(MKey, 1, True); PopUpShiftKeys; end else DisplayMessage('Invalid KeyName'); Inc(I); end; end; end; Result := true; PopUpShiftKeys;end;end.
 
补充下 使用sendmessage给一个隐藏的程序发送 按键指令sendmessage 怎么用?或者postmessage
 
接受答案了.
 

Similar threads

S
回复
0
查看
828
SUNSTONE的Delphi笔记
S
S
回复
0
查看
760
SUNSTONE的Delphi笔记
S
D
回复
0
查看
832
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部