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

如何做出快速鍵功能?

尚未結案
shihchin
一般會員


發表:10
回覆:12
積分:4
註冊:2002-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-03 19:51:22 IP:210.241.xxx.xxx 未訂閱
我想要做出可以讓使用者自訂快速鍵的功能,按下自訂的快速鍵之後就會帶出一字串,例如:按下Ctrl+1會帶出I Love You,Ctrl+1+2會帶出I Hate You, Ctrl按著之後,並不限定只能按一個鍵,而是可以自定按好幾個鍵,我只能抓出使用者按了Ctrl,沒辦法在抓到使用者按了1,請會的大大教我一下,或者教我如何著手,先謝謝各位大大, 發表人 -
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-03 19:56:32 IP:61.221.xxx.xxx 未訂閱
引言: 我想要做出可以讓使用者自訂快速鍵的功能,按下自訂的快速鍵之後就會帶出一字串,例如:按下Ctrl 1會帶出I Love You,Ctrl 1 2會帶出I Hate You, Ctrl按著之後,並不限定只能按一個鍵,而是可以自定按好幾個鍵,我只能抓出使用者按了Ctrl,沒辦法在抓到使用者按了1,請會的大大教我一下,或者教我如何著手,先謝謝各位大大, < face="Verdana, Arial, Helvetica"> shihchin 你好: 請問~~你所說的快速鍵是要用在什麼元件上呢?? 所謂的帶出字串又是什麼呢?? 你的意思是不是說,例如: 當 focus 在 Memo1 的時候,按下 Ctrl 1 就會自 動在 Memo1 裡面加上 I Love You 的字串呢?? < class="code"> void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key=='1' && Shift.Contains(ssCtrl)) { Memo1->SetSelTextBuf("I Love You"); } } -- Enjoy Researching & Developing -- 發表人 - RaynorPao 於 2003/03/03 20:10:04
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
shihchin
一般會員


發表:10
回覆:12
積分:4
註冊:2002-12-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-03 21:56:48 IP:61.56.xxx.xxx 未訂閱
對,就是要做這樣的功能,而且是不只只是按一個鍵,而是可能一次按好幾個鍵,例如:Ctrl+1+2 OR Ctrl+d+k+u,Ctrl後面是可以由使用者自訂,不限定幾個字,謝謝大大的回覆
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-04 11:42:19 IP:203.73.xxx.xxx 未訂閱
引言: 對,就是要做這樣的功能,而且是不只只是按一個鍵,而是可能一次按好幾個鍵,例如:Ctrl 1 2 OR Ctrl d k u,Ctrl後面是可以由使用者自訂,不限定幾個字,謝謝大大的回覆 < face="Verdana, Arial, Helvetica"> shihchin 你好: 以下是我大概想到的辦法,如果你覺得可以的話,就先這樣做吧< > 不過~~我認為做法上應該還有很大的改進空間,這點就留給你自己做了< >
TStringList *slKey;
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
   int iIndex=slKey->IndexOf(IntToStr(Key));
   if(iIndex==-1)
   {
      slKey->Add(IntToStr(Key));
   }
   if(slKey->IndexOf(IntToStr('1'))!=-1 && slKey->IndexOf(IntToStr('2'))!=-1
      && Shift.Contains(ssCtrl))
   {
      Memo1->SetSelTextBuf("I Love You");
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
   int iIndex=slKey->IndexOf(IntToStr(Key));
   if(iIndex!=-1)
   {
      slKey->Delete(iIndex);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   slKey=new TStringList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   delete slKey;
}
//---------------------------------------------------------------------------
備註:
有一個更簡單的方法
void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
   if(((GetKeyState('1') & 0x8000) || (GetKeyState(VK_NUMPAD1) & 0x8000))
      && ((GetKeyState('2') & 0x8000) || (GetKeyState(VK_NUMPAD2) & 0x8000))
      && ((GetKeyState('3') & 0x8000) || (GetKeyState(VK_NUMPAD3) & 0x8000))
      && GetKeyState(VK_CONTROL) & 0x8000)
   {
      Memo1->SetSelTextBuf("I Love You");
   }
}
-- Enjoy Researching & Developing -- 發表人 - RaynorPao 於 2003/03/05 15:40:55
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-05 19:55:12 IP:140.126.xxx.xxx 未訂閱
對,就是要做這樣的功能,而且是不只只是按一個鍵,而是可能一次按好幾個鍵,例如:Ctrl+1+2 OR Ctrl+d+k+u,Ctrl後面是可以由使用者自訂,不限定幾個字,謝謝大大的回覆    shihchin 你好:   你說要一次同時按好幾個按鍵, 例如 1 2 之類的, 就我所知是不可能辦到的因為這時從鍵盤送來的 scancode 只可能是 ctrl 1 或 ctrl 2 這樣, 所以你想要的功能看來很難做到, 不過你可以做循序按鍵的功能, 就是先ctrl 1 後ctrl 2 之類的功能, 然後 紀錄相關按鍵紀錄 以啟動相對的 function.
------
不要忘記呼吸,不要忘記編程! ∩__∩
aip999
初階會員


發表:10
回覆:63
積分:44
註冊:2002-03-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-06 02:24:05 IP:218.187.xxx.xxx 未訂閱
引言: 對,就是要做這樣的功能,而且是不只只是按一個鍵,而是可能一次按好幾個鍵,例如:Ctrl 1 2 OR Ctrl d k u,Ctrl後面是可以由使用者自訂,不限定幾個字,謝謝大大的回覆 shihchin 你好: 你說要一次同時按好幾個按鍵, 例如 1 2 之類的, 就我所知是不可能辦到的因為這時從鍵盤送來的 scancode 只可能是 ctrl 1 或 ctrl 2 這樣, 所以你想要的功能看來很難做到, 不過你可以做循序按鍵的功能, 就是先ctrl 1 後ctrl 2 之類的功能, 然後 紀錄相關按鍵紀錄 以啟動相對的 function.
宣告一個bool keys[256]; 然後KeyDown那邊 keys[Key] = TRUE; 在KeyUp那邊 keys[Key] = FALSE; 然後可以在KeyDown那邊判斷 if (Keys['1'] && Keys['2'] && Keys['3']))... 這樣就可以了
系統時間:2024-05-05 9:04:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!