为什么给窗口发ESC键WM_KEYDOWN消息无效?

luckychange 2001-12-25 03:07:20
我在一个程序中捕捉另一个程序的窗口并发送WM_KEYDOWN消息,但是ESC键死活收不到,我甚至用了以下代码,还是不行~~~
for n:=0 to 255 do
begin
postmessage(wnd,WM_KEYDOWN,VK_ESCAPE,0);
postmessage(wnd,WM_KEYDOWN,VK_ESCAPE,0);
end;
(WM_CHAR我也试过,没用~~~)
我试着用spy++捕捉那个窗口,看到我程序中发送的和按键产生的消息一模一样
其中我还知道F1键也没进去,请问是不是该用别的消息,或是什么参数……
请指教。
...全文
648 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
BigBen 2001-12-28
  • 打赏
  • 举报
回复
我可以肯定你哪里出错了。我用sendmessage,postmessage都可以直接发vk_escape。
postmessage(findwindow('tmyform','myform'),wm_keydown,vk_escape,0);
你发给了application?
blackdell 2001-12-27
  • 打赏
  • 举报
回复
如果接收消息的窗体也是delphi做的,是不是要将窗体的KeyPreview设为True?
Ykang 2001-12-27
  • 打赏
  • 举报
回复
我觉得你要看清楚是是主窗口在处理ESC还是它的子控制在处理。
luckychange 2001-12-26
  • 打赏
  • 举报
回复
先谢谢大家!
我用spy++抓那个窗体,没有其它控间,就只有一个窗体(其实是个游戏)。
wnd值没错,可见字符能和Enter能收到,sendmessage我也试过,没用!
谢谢zswang的代码,可是我不是要在自己的窗体内处理Esc键消息,而是往其它窗体发送Esc键消息,但它没接收到,或者说接受到但没反应(因为spy++反映窗体接受我按Esc键的消息和我发送的消息一模一样,但却没出现按键的效果……)
非常困惑中~~~
BigBen 2001-12-25
  • 打赏
  • 举报
回复
这个问题,呵呵,要追踪到twincontrol的CM_KEYDOWN事件中去,在这里,vk_escape,vk_up,vk_enter等“dlgkeys”被特殊处理(比如你想在一个button中处理方向键看看,是收不到消息的。),要自己处理相应的按键,覆盖cm_keydown,cm_keyup就可以了。
王集鹄 2001-12-25
  • 打赏
  • 举报
回复
我提供给你的是模拟系统按键的函数
参考Windows.SetFocus
王集鹄 2001-12-25
  • 打赏
  • 举报
回复
const
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
VK_0 = $30; VK_1 = $31; VK_2 = $32; VK_3 = $33; VK_4 = $34;
VK_5 = $35; VK_6 = $36; VK_7 = $37; VK_8 = $38; VK_9 = $39;

{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
VK_A = $41; VK_B = $42; VK_C = $43; VK_D = $44;
VK_E = $45; VK_F = $46; VK_G = $47; VK_H = $48;
VK_I = $49; VK_J = $4A; VK_K = $4B; VK_L = $4C; VK_M = $4D; VK_N = $4E;
VK_O = $4F; VK_P = $50; VK_Q = $51; VK_R = $52; VK_S = $53; VK_T = $54;
VK_U = $55; VK_V = $56; VK_W = $57; VK_X = $58; VK_Y = $59; VK_Z = $5A ;

procedure SendKey(const mKey: Word; mShiftState: TShiftState; mCount: Integer = 1); overload;
const
cExtended: set of Byte = [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_HOME,
VK_END, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE];

procedure pKeyboardEvent(mKey, mScanCode: Byte; mFlags: Longint);
var
vKeyboardMsg: TMsg;
begin
keybd_event(mKey, mScanCode, mFlags, 0);
while PeekMessage(vKeyboardMsg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) do begin
TranslateMessage(vKeyboardMsg);
DispatchMessage(vKeyboardMsg);
end;
end; { pKeyboardEvent }

procedure pSendKeyDown(mKey: Word; mGenUpMsg: Boolean);
var
vScanCode: Byte;
vNumState: Boolean;
vKeyBoardState: TKeyboardState;
begin
if (mKey = VK_NUMLOCK) then begin
vNumState := ByteBool(GetKeyState(VK_NUMLOCK) and 1);
GetKeyBoardState(vKeyBoardState);
if vNumState then
vKeyBoardState[VK_NUMLOCK] := (vKeyBoardState[VK_NUMLOCK] and not 1)
else vKeyBoardState[VK_NUMLOCK] := (vKeyBoardState[VK_NUMLOCK] or 1);
SetKeyBoardState(vKeyBoardState);
Exit;
end;

vScanCode := Lo(MapVirtualKey(mKey, 0));
if (mKey in cExtended) then begin
pKeyboardEvent(mKey, vScanCode, KEYEVENTF_EXTENDEDKEY);
if mGenUpMsg then
pKeyboardEvent(mKey, vScanCode, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP)
end else begin
pKeyboardEvent(mKey, vScanCode, 0);
if mGenUpMsg then pKeyboardEvent(mKey, vScanCode, KEYEVENTF_KEYUP);
end;
end; { pSendKeyDown }

procedure pSendKeyUp(mKey: Word);
var
vScanCode: Byte;
begin
vScanCode := Lo(MapVirtualKey(mKey, 0));
if mKey in cExtended then
pKeyboardEvent(mKey, vScanCode, KEYEVENTF_EXTENDEDKEY and KEYEVENTF_KEYUP)
else pKeyboardEvent(mKey, vScanCode, KEYEVENTF_KEYUP);
end; { pSendKeyUp }

var
I: Integer;
begin
for I := 1 to mCount do begin
if ssShift in mShiftState then pSendKeyDown(VK_SHIFT, False);
if ssCtrl in mShiftState then pSendKeyDown(VK_CONTROL, False);
if ssAlt in mShiftState then pSendKeyDown(VK_MENU, False);
pSendKeyDown(mKey, True);
if ssShift in mShiftState then pSendKeyUp(VK_SHIFT);
if ssCtrl in mShiftState then pSendKeyUp(VK_CONTROL);
if ssAlt in mShiftState then pSendKeyUp(VK_MENU);
end;
end; { SendKey }

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.SetFocus;
SendKey(VK_Z, [ssCtrl]);
end;
Ykang 2001-12-25
  • 打赏
  • 举报
回复
你的wnd值对不对?
再试试SendMessage看看;
刘志飞 2001-12-25
  • 打赏
  • 举报
回复
消息先传给了其它控件、窗体了

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧