線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3670
推到 Plurk!
推到 Facebook!

keybd_event 的 Shift 的 功能 無法使用 左右鍵達到 Mark 的動作 !

答題得分者是:lld_h_z
carloyan
一般會員


發表:35
回覆:14
積分:9
註冊:2004-05-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-02 14:00:20 IP:61.56.xxx.xxx 未訂閱
我自行做一個螢幕小鍵盤程式,1~9,a~z,的Button 功能都可以用 keybd_event 這個函式完成(包含大小寫), 可是發現一個問題, 當我 KeyIn 一些字元後, 想用 Shift 左右鍵 的 Button 來 Mark 剛剛的字串時, 卻完全沒有作用, 游標只會左右移動, 並沒有 Mark 的動作 ! 不知如何解決這個現象 ? (而在實際的鍵盤上卻可以 Mark) 我的 Key Code 大致如下 : //-------------------------------------------------------------------- void __fastcall TForm1::Button2KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { // cVKDown 就是 Keyboard Virtual Key Codes ::keybd_event((BYTE)cVKDown, (BYTE)::MapVirtualKey(cVKDown,0), 0, 0); } //-------------------------------------------------------------------- void __fastcall TForm1::Button2KeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { // cVKUp 就是 Keyboard Virtual Key Codes ::keybd_event((BYTE)cVKUp, (BYTE)::MapVirtualKey(cVKUp,0), KEYEVENTF_KEYUP, 0); } //--------------------------------------------------------------------
lld_h_z
一般會員


發表:0
回覆:4
積分:5
註冊:2005-09-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-07 17:36:17 IP:59.36.xxx.xxx 未訂閱
每次按键都必须释放 也就是说 keydb_event(VK,0,0,0); keybd_event(VK,0,KEYEVENTF_KEYUP,0);//必须释放 必须成对出现,在你程式中补上keyup的部分看看
carloyan
一般會員


發表:35
回覆:14
積分:9
註冊:2004-05-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-07 18:12:20 IP:61.56.xxx.xxx 未訂閱
引言: Ω 键常?须释 ;超 说 keydb_event(VK,0,0,0); keybd_event(VK,0,KEYEVENTF_KEYUP,0);//?须释 ?须Θ对?现,? 促Α?补5keyup 場?
lld_h_z 前輩 ~ 我在每個Button Down之中有啟動Timer1計時,當Button按下超過一定的時間時,會自動將最後 KeyIn 的字元做Repeat,Button放下後即解除Timer1,幾乎按照真實的鍵盤的方式去作,所以應該沒這個問題! 而且我在NoteBook的電腦上反而功能完全正常,收到的Code也正常,所以我才覺得很頭痛!
lld_h_z
一般會員


發表:0
回覆:4
積分:5
註冊:2005-09-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-08 08:38:09 IP:59.36.xxx.xxx 未訂閱
carloyan:我可不是前辈 你是要用你的按键模拟Shift ->? 模拟的格式应该是: keybd_event(VK_LSHIFT,0,0,0); keybd_event(VK_RIGHT,0,0,0); keybd_event(VK_RIGHT,0,KEYEVENT_KEYUP,0); keybd_event(VK_LSHIFT,0,KEYEVENT_KEYUP,0); 只有光标移动没有mark应该是你在发送左右按键消息时,Shift按键已经释放
carloyan
一般會員


發表:35
回覆:14
積分:9
註冊:2004-05-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-08 11:16:22 IP:61.56.xxx.xxx 未訂閱
引言: carloyan:我可不是前辈 你是要用你的按键模拟Shift ->? 模拟的格式应该是: keybd_event(VK_LSHIFT,0,0,0); keybd_event(VK_RIGHT,0,0,0); keybd_event(VK_RIGHT,0,KEYEVENT_KEYUP,0); keybd_event(VK_LSHIFT,0,KEYEVENT_KEYUP,0); 只有光标移动没有mark应该是你在发送左右按键消息时,Shift按键已经释放
沒錯 ! lld_h_z 兄, 我就是要模擬 Shift -> (包含所有的方向鍵) 以下是我下的指令 ::keybd_event((BYTE)VK_SHIFT,(BYTE)::MapVirtualKey(VK_SHIFT,0),0,0); ::keybd_event((BYTE)VK_LEFT,(BYTE)::MapVirtualKey(VK_LEFT,0),0,0); ::keybd_event((BYTE)VK_LEFT,(BYTE)::MapVirtualKey(VK_LEFT,0),KEYEVENTF_KEYUP,0); ::keybd_event((BYTE)VK_SHIFT, (BYTE)::MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0); 其在PC上的結果是 KeyDown 16 ←Shift Down KeyUp 16 ←Shift Up (自行產生的) KeyDown 37 ←Left Down KeyUp 37 ←Left Up KeyDown 16 ←Shift Down (自行產生的) KeyUp 16 ←Shift Up 但是在 Notebook 上卻是正常的結果 KeyDown 16 ←Shift Down KeyDown 37 ←Left Down KeyUp 37 ←Left Up KeyUp 16 ←Shift Up 同樣一個程式,在筆記型電腦上可以動作正常,在PC端卻不行!奇怪吧! 我有在這個網站下載過別人曾經發表過的 螢幕小鍵盤程式,發現他的問題跟我一樣,只是他可能沒注意到吧! 我在微軟的網站上 http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc 看了這篇文章,裡頭有提到這個Shift 方向鍵的問題,似乎要加上硬體掃描碼,而我也加了(不知對不對而已),出現的反應還是不正確! 發表人 - carloyan 於 2005/09/08 13:33:49
lld_h_z
一般會員


發表:0
回覆:4
積分:5
註冊:2005-09-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-08 13:34:03 IP:59.36.xxx.xxx 未訂閱
carloyan兄: 程序应该是没有问题的,你看看是不是timer的问题 方便的话能否把程式传给我测试一下 你也可以用spy 查一下整个程式的运行期消息 还有下面一片CSDN上的帖子,看能否对你有帮助 http://dev.csdn.net/develop/article/52/52997.shtm EMAIL:lld_hz@hotmail.com PS:MS建议2000/xp下不要使用mouse_event,keybd_event,而使用 INPUT结构和SendInput(.....)函数,你找找这方面的资料 發表人 - lld_h_z 於 2005/09/08 13:38:34
carloyan
一般會員


發表:35
回覆:14
積分:9
註冊:2004-05-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-08 17:37:43 IP:61.56.xxx.xxx 未訂閱
引言: carloyan兄: 程序应该是没有问题的,你看看是不是timer的问题 方便的话能否把程式传给我测试一下 你也可以用spy 查一下整个程式的运行期消息 还有下面一片CSDN上的帖子,看能否对你有帮助 http://dev.csdn.net/develop/article/52/52997.shtm EMAIL:lld_hz@hotmail.com PS:MS建议2000/xp下不要使用mouse_event,keybd_event,而使用 INPUT结构和SendInput(.....)函数,你找找这方面的资料 發表人 - lld_h_z 於 2005/09/08 13:38:34
我參考了 http://delphi.ktop.com.tw/topic.php?topic_id=56498 dllee版主的程式碼,後來姑且試試看 ! 試了一些方法 ! 最後給他成功囉 ! 程式碼如下 : 按下 Shift 鍵時 ::keybd_event((BYTE)VK_SHIFT, (BYTE)::MapVirtualKey(VK_SHIFT,0), KEYEVENTF_EXTENDEDKEY | 0, 0); 按下 Left 鍵時 ::keybd_event((BYTE)VK_LEFT, (BYTE)::MapVirtualKey(VK_LEFT,0), 0, 0); 放開 Left 鍵時 ::keybd_event((BYTE)VK_SHIFT, (BYTE)::MapVirtualKey(VK_SHIFT,0), KEYEVENTF_KEYUP, 0); ::keybd_event((BYTE)VK_LEFT, (BYTE)::MapVirtualKey(VK_LEFT,0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); 放開 Shift 鍵時 ::keybd_event((BYTE)VK_SHIFT, (BYTE)::MapVirtualKey(VK_SHIFT,0), KEYEVENTF_KEYUP, 0); 原因? 我真的不清楚為什麼這樣就可以了! 先謝謝 lld_h_z 兄 ~ 提供的 http://dev.csdn.net/ 網站,看來可以好好看看了 ! 那關於這篇 http://delphi.ktop.com.tw/topic.php?topic_id=53805 所提供的程式, 雖然沒有 Source Code, 不過執行後所發生的問題也是一樣的, 無法 Shift 方向鍵 Mark 字元,甚感可惜! 關於 Spy 這個似乎是 VC 所提供的功能,我沒有這個軟體,所以不能用 ! 餀~ 很窮沒辦法 ~~~
algo
一般會員


發表:4
回覆:21
積分:10
註冊:2003-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-09 12:20:45 IP:59.120.xxx.xxx 未訂閱
引言: 關於 Spy 這個似乎是 VC 所提供的功能,我沒有這個軟體,所以不能用 ! 餀~ 很窮沒辦法 ~~~
話說VC有Spy ,BCB有WinSight32這樣... 不妨看一下BCB在程式集裡面的東西。 一點點建議供您參考! ???
------
???
系統時間:2024-04-20 16:58:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!