如何自製一個螢幕鍵盤 |
尚未結案
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
|
skurama
中階會員 發表:88 回覆:127 積分:73 註冊:2002-07-22 發送簡訊給我 |
|
skurama
中階會員 發表:88 回覆:127 積分:73 註冊:2002-07-22 發送簡訊給我 |
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 發送簡訊給我 |
謝謝您的指點,關於該問題我查閱之前之歷史資料還是有幾點不明聊
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 發送簡訊給我 |
我用以下方式測試
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 發送簡訊給我 |
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 發送簡訊給我 |
再請問
我除了使用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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |