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

如何自製一個螢幕鍵盤

尚未結案
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-24 22:08:18 IP:61.59.xxx.xxx 未訂閱
我想自製一個螢幕鍵盤,來取代實體鍵盤 且焦點位置是在任一所指定之輸入格上 1.應該如何送出字元 2.當我按下螢幕鍵盤時,焦點位置是否會被螢幕鍵盤所取代,而不是原先預輸入之輸入格上了
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-25 09:29:13 IP:61.219.xxx.xxx 未訂閱
sorry~~按錯,看下一偏文章! 謝謝! 發表人 - skurama 於 2003/12/25 09:58:43
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-25 09:39:40 IP:61.219.xxx.xxx 未訂閱
HI~~您好: >1.應該如何送出字元 下面這個是天使大大的範例 http://delphi.ktop.com.tw/topic.php?topic_id=27587 這個範列可以將按鍵給一個已啟動的程式!! 大概是這個吧 SendMessage(); 或是用win api keybd_event(); >2.當我按下螢幕鍵盤時,焦點位置是否會被螢幕鍵盤所取代,而不是原先預輸 >入之輸入格上了 我想你在按下按鈕時,該自制的鍵盤就會被Focused在最上方, 如果你想在回到要把自輸入的元件上時, 你可以參考以下http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23708 其中有一段 則可以讓你要的視窗移動到最上方, //找到你要的該視窗程式 hWnd := FindWindow('TApplication', PChar('Project1.Exe')); //讓找到的視窗在最上方 if hWnd <> 0 then SetForegroundWindow(hWnd); 組合以上兩個範例,應該是可以做出你要的程式。 小弟意見,參考參考!! ---------------- 昂首千丘遠, 嘯傲風間, 堪尋敵手共論劍, 高處不甚寒! ---------------- 發表人 - skurama 於 2003/12/25 10:05:34
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-27 21:39:12 IP:61.59.xxx.xxx 未訂閱
謝謝您的指點,關於該問題我查閱之前之歷史資料還是有幾點不明聊 1. keybd_event(VK_NUMPAD3, 0, 0, 0); keybd_event(VK_NUMPAD3, 0, KEYEVENTF_KEYUP, 0); 這二段之意義為何 我查閱虛擬鍵的編碼(Virtual-key Codes) 0鍵為VK_0 A 鍵為VK_A, 為何我改成keybd_event(VK_A, 0, 0, 0);時 [Error] : Undeclared identifier: 'VK_A' 2.這幾個範例軍事將字元傳送到notepad,小弟不才 假設我有多個輸入格,如何先取得某輸入格之焦點,當按下螢幕鍵盤button時將字元傳送到該指定之輸入格上
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-27 21:48:43 IP:61.59.xxx.xxx 未訂閱
我用以下方式測試 procedure TForm1.Button1Click(Sender: TObject); begin edit1.SetFocus; keybd_event(VK_NUMPAD3, 0, 0, 0); keybd_event(VK_NUMPAD3, 0, KEYEVENTF_KEYUP, 0); end; procedure TForm1.Button2Click(Sender: TObject); begin edit1.SetFocus; keybd_event(VK_NUMPAD4, 0, 0, 0); keybd_event(VK_NUMPAD4, 0, KEYEVENTF_KEYUP, 0); end; 問題 1.我查閱虛擬鍵的編碼(Virtual-key Codes) 0鍵為VK_0 A 鍵為VK_A, 為何我改成keybd_event(VK_A, 0, 0, 0);時 [Error] : Undeclared identifier: 'VK_A' keybd_event(VK_NUMPAD3, 0, 0, 0); keybd_event(VK_NUMPAD3, 0, KEYEVENTF_KEYUP, 0); 這二段之意義為何? 2.測試中是強制輸入到edit1,且成功 但如何隨時取得滑鼠所在之焦點
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-30 15:13:15 IP:61.219.xxx.xxx 未訂閱
keybd_event( 1) 虛擬鍵盤值 (1-254) a = 65, 2) Specifies a hardware scan code for the key. 設0即可, 3) 0是按下、KEYEVENTF_KEYUP 鍵盤按鍵彈起, 4) Specifies an additional 32-bit value associated with the key stroke. 設0即可 ); 是一個WinAPI的函式,可以把他看成是模擬鍵盤搞擊, 如果是要A的話, keydb_event(65,0,0,0); keydb_event(65,0,KEYEVENTF_KEYUP,0); 但是小寫的字元 VK_NUMPAD3則是指右邊數字鍵的3 所以 edit1.SetFocus; keybd_event(VK_NUMPAD3, 0, 0, 0); keybd_event(VK_NUMPAD3, 0, KEYEVENTF_KEYUP, 0); 表示先將視窗focus到edit1上, 再按下數字3,再放掉數子3, 則在edit1上會出現3 ====================================================== 2. 我想你所說的滑鼠焦點,應該是指目前focuse在哪個欄位吧, 可以利用 self.ActiveControl 來判斷 在 TForm 內打入self表示該 form的意思 , 而activeControl則是Form上目前焦點所在的元件, 但因為self.ActiveControl是一個 TWinContrl, 必需轉換成你要的元件, if self.activeControl is TEdit then begin showmessage('目前focus在一個名為' (self.activeControl as TEdit).name '的TEdit元件'); end else if self.activeControl is TButton then begin showmessage('目前focus在一個名為' (self.activeControl as TButton).name '的TButton元件'); end; 如果要知道目前所在的元件是什麼的話, 可以用 showmessage(self.ActiveControl.ClassName); 取得目前該元件的Type。 如果要找定在Edit1上打入可以改成 //判斷是否focus在edit1上,如果不是則自行設定focus在edit1上 if not Edit1.Focused then begin edit1.SetFocus; keybd_event(VK_NUMPAD3, 0, 0, 0); keybd_event(VK_NUMPAD3, 0, KEYEVENTF_KEYUP, 0); end else begin //如果已經是在edit1上時,則直接打入3 keybd_event(VK_NUMPAD3, 0, 0, 0); keybd_event(VK_NUMPAD3, 0, KEYEVENTF_KEYUP, 0); end; 小弟愚見,參考參考! ---------------- 昂首千丘遠, 嘯傲風間, 堪尋敵手共論劍, 高處不甚寒! ----------------
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-02 22:33:58 IP:61.59.xxx.xxx 未訂閱
再請問 我除了使用VK_NUMPAD*之外,可以正常取出 keybd_event(VK_NUMPAD3, 0, 0, 0); keybd_event(VK_NUMPAD3, 0, KEYEVENTF_KEYUP, 0); 其餘諸如 keybd_event(65, 0, 0, 0); keybd_event(65, 0, KEYEVENTF_KEYUP, 0); --------------------------------- keybd_event(VK_A, 0, 0, 0); keybd_event(VK_A, 0, KEYEVENTF_KEYUP, 0); ---------------------------------------- 等均會有[Error] : Undeclared identifier: 'VK_A' 1.我查閱虛擬鍵的編碼(Virtual-key Codes) 0鍵為VK_0 48 A 鍵為VK_A 65 這些在keybd_event中還有哪些要注意的地方
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-02 23:00:12 IP:61.59.xxx.xxx 未訂閱
private     t : string;   ;應該不能宣告成String? { Private declarations } //取得輸入格之名稱 procedure TForm1.Edit2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin t:= (self.activeControl as TEdit).name; end; //將焦點放置於剛才所取得的物件上 procedure TForm1.Button6Click(Sender: TObject); begin t.SetFocus; 因為是將t設為String,所以是錯誤,那該如何將t改變為Tedit? end;
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-03 14:29:47 IP:61.219.xxx.xxx 未訂閱
private t : string; ;應該不能宣告成String? { Private declarations }    //取得輸入格之名稱 procedure TForm1.Edit2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin t:= (self.activeControl as TEdit).name; end;    ------------------------------------------- 到以上的做法應該都不正確,但如果要找到該元件, 要用以下的方法 --------------------------------------------    
var
   i : integer;
begin
   //self在此表示Form, ComponentCount表示Form上的元件數
   //i由0開始是因為元件的索引值由0開始,所以 componentcount 要減1
   for i := 0 to self.ComponentCount - 1 do
   begin
       //self.components[i] 只索引值為i的那個元件
       //如果那個元件是TEdit才繼續做
       if self.Components[i] is TEdit then              //將self.components[i] 轉換為 TEdit 元件,
          //因為 components 是 TComponent 型態,
          //取得其元件名稱,如果名稱同之前變數 T的字串,
          //則繼續做
          if (self.Components[i] as TEdit).Name = t then
          begin
              (self.Components[i] as TEdit).SetFocus;
          end;
   end;
end;
---------------- 昂首千丘遠, 嘯傲風間, 堪尋敵手共論劍, 高處不甚寒! ----------------
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
AB
高階會員


發表:166
回覆:262
積分:125
註冊:2003-08-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-03 21:59:19 IP:61.64.xxx.xxx 未訂閱
使用api調用2000 xp 系統的 公用程式 system32\osk.exe 不知是否可以 如果你是要利用com port硬體傳x,y軸 或tcp協定 於pc方位與鍵盤輸入 最快應該是利用 osk.exe 相關資料可以去msdn 查看看 發表人 - ab 於 2004/01/03 22:16:39
系統時間:2024-07-01 20:55:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!