SHIFT+TAB 的键值为多少?(50分)

  • 主题发起人 主题发起人 Chen_Hui
  • 开始时间 开始时间
C

Chen_Hui

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用编程方法使另一程序中的输入焦点往回移动,必须发送按键消息<br>但不知道 SHIFT+TAB 组合键的键值为多少,另外,按TAB键不触发ONKEYDOWN,为什么?奉送50分求解答
 
是啊,我也发现TAB不触发OnKeyDown,可没想过为什么,为什么呢?
 
tab键默认的是转移焦点focus,在keydown里不会有。
 
在form设置 KeyPreview 为 true <br>在form 的 OnShortCut 事件可以检测 tab 键 VK_TAB <br>同时可以用 GetKeyState 检测 VK_SHIFT<br>在这里还可以改它的键值,变成好象按的是另外一个键
 
ASC码15. <br><br>要这东西干什么? Windows 本身是屏蔽的(就是说你得不到这个键码).
 
按tab键不触发WM_KEYDOWM消息
 
我的意思是:<br>&nbsp; &nbsp; 用postmessage(handle,WM_KEYDOWN,VK_TAB,0)可使输入焦点移到下<br>一个编辑框,但如何模拟SHIFT+TAB 键使输入焦点往前移动。当然控制的<br>是其他程序,且不通过使用EnumChildWindows得到所有子窗口的handle然后<br>用SetFocus确定输入焦点的方法来实现。<br><br>用postmessage(handle,WM_KEYDOWN,VK_SHIFT+VK_TAB,0)不起作用。另<br>外,15或16仅是SHIFT的键值,而非SHIFT+TAB的键值。<br>
 
var<br> w:HWND;<br> buf:TKeyBoardState;<br>begin<br><br>w:= 你还是找到现在激活的窗口<br><br>if(not AttachThreadInput(GetWindowThreadProcessId(w,nil),GetCurrentThreadId(),true))then<br> RaiseLastWin32Error();<br><br>GetKeyboardState(buf);<br>buf[VK_SHIFT]:=BYTE(buf[VK_SHIFT] or $80);<br>SetKeyboardState(buf);<br>PostMessage(w,WM_KEYDOWN,VK_TAB,0);<br>PostMessage(w,WM_KEYUP,VK_TAB,1);<br><br>if(not AttachThreadInput(GetWindowThreadProcessId(w,nil),GetCurrentThreadId(),false))then<br> RaiseLastWin32Error();<br>end;<br>
 
Pipi的方法可以解决焦点的反向移动问题,但用getfocus得到的仍是前一个窗口的<br>句柄,因此还是无法在新的窗口中写内容。如能解决分数DOUBLE
 
来得太晚了,不知...? *_*!<br><br>H 为激活窗体的句柄<br><br>SendMessage(H, WM_NEXTDLGCTL, 1, 0) // 上一个焦点<br><br>SendMessage(H, WM_NEXTDLGCTL, 0, 0) // 下一个焦点<br><br>If 你是在写一个控件,可以用这种方法截获 Tab 按键的消息<br>private<br>procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN;<br>...<br><br>因为这种设置焦点的消息,叫做 Dialog Msg ? 什么什么的,<br>不会传到 OnKeyDown 事件去处理的,<br>具体该怎么说,我也说不清楚 *_*!
 
Shift与Tab 不会组合的。<br>请看一看关于keydata和shiftstate一方面的资料。<br>你可以利用application的onmessage方法截取线程的所有消息。
 
呵呵,和我一样的问题!都答非所问!都在讨论窗口,而我只需要是EDIT控件<br>里移动啊!<br>是吧,CHEN_HUI!!
 
接受答案了.
 
后退
顶部