全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2256
推到 Plurk!
推到 Facebook!

請問我要如何送一個 TAB 鍵給元件?

答題得分者是:jessechan
BGman
初階會員


發表:28
回覆:85
積分:42
註冊:2003-01-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-19 16:25:26 IP:211.22.xxx.xxx 未訂閱
我的 Form 上,有一個 Memo 、一個 Button
TForm1::Button1Click(TObject *Sender)
{
  Memo1->Setfocus();
  ::SendMessage( this->Handle, 0, 9, 0);
}
我想要練習API的使用,將焦點先移到Memo,接者再一個 TAB 鍵, 使焦點再移出Memo,但是沒有作用! 請問應該要用哪一個 API ?謝謝!
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-20 00:21:47 IP:61.228.xxx.xxx 未訂閱
試試這樣, Memo1->SetFocus(); keybd_event(0x09,MapVirtualKey(0x09,0),0,0); 有關 keybd_event 的用法請查 help Jesse Chan
------
Jesse Chan
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-20 02:00:27 IP:211.76.xxx.xxx 未訂閱
可以試試丟Message的方式 PostMessage(Memo1->Handle, WM_KEYDOWN, VK_TAB, 1); 也可以用keybd_event, 但是用這個方法正常的作法要丟keydown和keyup 也就是摸擬按鍵的行為要全部作完 <--- 沒作好會不會怎麼, 我是沒試過 用PostMessage的好處是, 只要有Handle就可以丟, 所以可以丟到任何一個Vcl 或是Windows裡面的任何一個AP裡, 前提是你知道它的Handle. 而且只要作一次動作即可, 不會有任何的問題
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-20 03:00:05 IP:61.228.xxx.xxx 未訂閱
引言: 可以試試丟Message的方式 PostMessage(Memo1->Handle, WM_KEYDOWN, VK_TAB, 1); 也可以用keybd_event, 但是用這個方法正常的作法要丟keydown和keyup 也就是摸擬按鍵的行為要全部作完 <--- 沒作好會不會怎麼, 我是沒試過 用PostMessage的好處是, 只要有Handle就可以丟, 所以可以丟到任何一個Vcl 或是Windows裡面的任何一個AP裡, 前提是你知道它的Handle. 而且只要作一次動作即可, 不會有任何的問題
lcsboy 大大, 在 M$DN 中有關 keybd_event 的敍述如下, keybd_event The keybd_event function synthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver's interrupt handler calls the keybd_event function. 所以小弟覺得您所擔心的問題在 keybd_event 中較不會發生, 反倒是 SendMessage 的作法最好是先 send keydown 再 send keyup, 才算完成整個動作, 因為你不能保證程式是寫在 keydown, keyup, 或是 keypress 中, 所以會比較麻煩一點. 當然 keybd_event 比較不好的地方在於它的 scope 是整個系統, 無法針對特定視窗發送, 這是 keybd_event 強大的地方, 卻也是它的缺點. 若有觀念錯誤之處, 請您再指點. 謝謝. Jesse Chan
------
Jesse Chan
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-20 09:12:03 IP:211.23.xxx.xxx 未訂閱
嗯...細部的動作的確要參照M$DN所述    不過戲法人人會變, 巧妙各有不同    丟Key的動作, 大致上就是keybd_event和丟Message兩種    針對不同程式的目的, 選擇較適當的寫法
BGman
初階會員


發表:28
回覆:85
積分:42
註冊:2003-01-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-20 14:03:39 IP:211.22.xxx.xxx 未訂閱
感謝兩位高手的指導! 我閱讀了Help 之後,了解這個API是如何將訊息傳送至System Message Queue 但是對於 dwFlags 這個參數還有些疑問...
VOID keybd_event(
    BYTE bVk,        // virtual-key code
    BYTE bScan,        // hardware scan code
    DWORD dwFlags,        // flags specifying various function options
    DWORD dwExtraInfo // additional data associated with keystroke
   );
用了這個 KEYEVENTF_EXTENDEDKEY 常數之後, 會在鍵盤掃描碼前置位元組加上 0xE0, 請問有什麼應用時機?
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-20 16:28:54 IP:203.75.xxx.xxx 未訂閱
我不是很確定, 用了那麼久也從沒有加上這個 flag, 我想這應是 for 某些特殊鍵盤擴充使用的, 不會有什麼影響. Jesse Chan
------
Jesse Chan
系統時間:2024-03-29 2:28:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!