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

要怎麼判定是否為可輸入元件?

尚未結案
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-15 16:55:12 IP:140.113.xxx.xxx 未訂閱
想請問各位高手, 我現在用程式控制其他的程式,並且用 GetFocus() 獲得了當前元件的handle, 那我要怎麼知道這個元件是否是可輸入元件呢? (像是 Edit, Memo, Combobox 之類可打字的,只要能輸入的都算) -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-16 10:43:01 IP:61.63.xxx.xxx 未訂閱
引言: 想請問各位高手, 我現在用程式控制其他的程式,並且用 GetFocus() 獲得了當前元件的handle, 那我要怎麼知道這個元件是否是可輸入元件呢? (像是 Edit, Memo, Combobox 之類可打字的,只要能輸入的都算) -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
chtai你好< >: 直覺上這問題很簡單(我個人覺得啦< >),因為editable元件其實就是一個edit control罷了!大到memo、小至stringgrid內的一個cell都是一個edit control!不同的只是它是single or multi line而已! 所以直覺上很簡單做,比如我只要送一個EM_GETHANDLE給這個元件,看它return的值是不是為0即可,為0表示它不是一個edit control!然而直覺的想法卻都沒有成功,最後我是用下面的方式測試成功,至於是否有其它的方法,就可能大家自行去try了! < class="code"> HWND hwnd=Edit1->Handle; if (SendMessage(hwnd,WM_CHAR,1,0)) ShowMessage("這是一個edit control!"); else ShowMessage("這不是一個edit control!"); 解釋 這個方法是我先送一個字元給這個被測試元件,一般來說如果它是一個edit control,則它會接受字元的輸入,也就是sendmessage的return值是true,反之則否!如此便可知道它是不是一個edit control! 送1的意思是送一個不可見的字元,經觀查元件接送後並不會有影響,所以送1,要不然送可見字元的話,元件接收後就還要delete這個字元,多此一舉! 最後我只測試了一些bcb中的簡單元件,其它元件,和其它程式語言中的元件都沒測過,就煩自try了, all!
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-18 20:33:29 IP:140.113.xxx.xxx 未訂閱
引言: chtai你好< >: 直覺上這問題很簡單(我個人覺得啦< >),因為editable元件其實就是一個edit control罷了!大到memo、小至stringgrid內的一個cell都是一個edit control!不同的只是它是single or multi line而已! 所以直覺上很簡單做,比如我只要送一個EM_GETHANDLE給這個元件,看它return的值是不是為0即可,為0表示它不是一個edit control!然而直覺的想法卻都沒有成功,最後我是用下面的方式測試成功,至於是否有其它的方法,就可能大家自行去try了! < class="code"> HWND hwnd=Edit1->Handle; if (SendMessage(hwnd,WM_CHAR,1,0)) ShowMessage("這是一個edit control!"); else ShowMessage("這不是一個edit control!"); 解釋 這個方法是我先送一個字元給這個被測試元件,一般來說如果它是一個edit control,則它會接受字元的輸入,也就是sendmessage的return值是true,反之則否!如此便可知道它是不是一個edit control! 送1的意思是送一個不可見的字元,經觀查元件接送後並不會有影響,所以送1,要不然送可見字元的話,元件接收後就還要delete這個字元,多此一舉! 最後我只測試了一些bcb中的簡單元件,其它元件,和其它程式語言中的元件都沒測過,就煩自try了, all! < face="Verdana, Arial, Helvetica"> 感謝 m8815010 兄的解答, 經小弟測試,看來在一般的元件上都可以正常運作, 可是這一招對網頁上的表單無效哩 < > 我試了一下,在網頁裡頭可以填資料的地方(如 >< > 或是有什麼方法可以偵測該元件是否可接受"貼上"指令嗎? 因為我原本的想法是,若該元件是
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-18 23:32:47 IP:203.73.xxx.xxx 未訂閱
引言: 感謝 m8815010 兄的解答, 經小弟測試,看來在一般的元件上都可以正常運作, 可是這一招對網頁上的表單無效哩 < > 我試了一下,在網頁裡頭可以填資料的地方(如 >< > 或是有什麼方法可以偵測該元件是否可接受"貼上"指令嗎? 因為我原本的想法是,若該元件是> chtai你好: 嗯,的確有一些問題,一一研究吧! 首先你說的 >! 我窄看了一下,網頁上的輸入的元件,有很多就是 class="code"> void __fastcall TForm1::Button1Click(TObject *Sender) { HWND hwnd=(HWND)0x103B0; //if (SendMessage(hwnd,WM_CHAR,'a',0)) // ShowMessage("這是一個edit control!"); //else // ShowMessage("這不是一個edit control!"); int orglen; orglen=SendMessage(hwnd,WM_GETTEXTLENGTH,0,0); SendMessage(hwnd,WM_CHAR,'a',0); int newlen=SendMessage(hwnd,WM_GETTEXTLENGTH,0,0); if (newlen==(orglen 1)) ShowMessage("這是一個edit control!"); else ShowMessage("這不是一個edit control!"); } 變得以檢證這個字元是否有真的append進去來判斷是否是editable元件!當然這裏必需送可見字元的,送完後也要注意這個字元的處理(刪除or sth. else)! 不過看過你的需求後,我覺得一般來說,只要全部以送WM_SETTEXT這個訊息去設定元件的text就可以解決問題了!因為太半元件都可以用這樣去設定text、caption的值!除非特別的元件,如TStringGird這樣的,但我想這種特殊元件你也要去設嗎??? 最後你的〝貼上〞想法,我之前有想過,因為一個editable元件它一定可以接受ctrl v、ctrl c這樣的指令,於是我就用WM_COPY、WM_PASTE這樣的訊息去測試這個元件是否可以被複製、貼上... 但不幸的,WM_COPY、WM_PASTE這些訊息在用SendMessage送的時候並沒有return值,所以我並無法知道結果是否成功! all,小小測試結果!
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-19 01:22:01 IP:140.113.xxx.xxx 未訂閱
引言: 首先你說的TestArea我還沒找到可測試的範例,不過印象中這是jave中等價於Edit的元件!但請你確認一下你的handle值沒有找錯! 我窄看了一下,網頁上的輸入的元件,有很多就是>< face="Verdana, Arial, Helvetica"> 其實現在回覆文章的區塊就是一個 textarea 了. 可是就我的測試,網頁裡頭的元件都失敗哩 :( handle 應該是沒問題的,因為我若是送出可視字元,它會顯示出來。
引言: 另外你說的MSN是指那方面???是MSN explore或是MSN messenger??? 如果是messenger的話,那我想你應該是在講上面的RichEdit20W元件,的確我發現這類的元件是有問題的(included BCB的 TRichEdit元件),原因很奇怪,是本元件在我們用wm_char送一個字元給它時,它會接收,但卻會return false,所以證明我們的方法也不是得準的!
是的,我是指 MSN messenger 打字的地方。 我就是在 MSN messenger 跟 Skype 遇到問題。 它們可以接受我送出的字元,卻不能依我預期的顯示出來, 所以我才希望找個偵測是否為editable元件的方法, 這樣就能用貼上的方式來正常顯示了。 為什麼 MSN 跟 Skype 這麼奇怪呢 :(
引言: 不過看過你的需求後,我覺得一般來說,只要全部以送WM_SETTEXT這個訊息去設定元件的text就可以解決問題了!因為太半元件都可以用這樣去設定text、caption的值!除非特別的元件,如TStringGird這樣的,但我想這種特殊元件你也要去設嗎???
可是用 WM_SETTEXT 的話,會把該元件原本的文字內容取代, 這不是我想要的。 我要 append 而不是 replace 的效果.
引言: 最後你的〝貼上〞想法,我之前有想過,因為一個editable元件它一定可以接受ctrl v、ctrl c這樣的指令,於是我就用WM_COPY、WM_PASTE這樣的訊息去測試這個元件是否可以被複製、貼上... 但不幸的,WM_COPY、WM_PASTE這些訊息在用SendMessage送的時候並沒有return值,所以我並無法知道結果是否成功!
看了您的 code 之後,我有一個想法。 我先用 WM_GETTEXTLENGTH 得到原本的長度, 再送出 WM_PASTE,再比對後來的文字長度是否相同, 若不同的話就代表有貼上了,那我的目的也達到了。 可是剛才試了一下,我送出 WM_PASTE 給筆記本,可以正確顯示, 但是送給其他軟體如 Word, MSN, 網頁,卻又失敗了 < >< > 真搞不懂是為什麼. -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-21 23:47:13 IP:203.73.xxx.xxx 未訂閱
引言: 其實現在回覆文章的區塊就是一個 textarea 了. 可是就我的測試,網頁裡頭的元件都失敗哩 :( handle 應該是沒問題的,因為我若是送出可視字元,它會顯示出來。 送出字元會顯示出來(表示成功呀),那麼〝失敗〞是指??
引言: 是的,我是指 MSN messenger 打字的地方。 我就是在 MSN messenger 跟 Skype 遇到問題。 它們可以接受我送出的字元,卻不能依我預期的顯示出來, 所以我才希望找個偵測是否為editable元件的方法, 這樣就能用貼上的方式來正常顯示了。 為什麼 MSN 跟 Skype 這麼奇怪呢 :(
接受卻不能依預期顯示出來?是指?? 最近我剛好在試寫messenger的auto-replying,我送字串到打字的地方(RichEdit20W元件)還ok啊!
引言: 可是用 WM_SETTEXT 的話,會把該元件原本的文字內容取代, 這不是我想要的。 我要 append 而不是 replace 的效果.
嗯,這應該還好吧,因為土一點就先用WM_GETTEXT去把原來的字串取回來,再拼上你想增加的字串,再一起WM_SETTEXT回去也就可以了啊!
引言: 看了您的 code 之後,我有一個想法。 我先用 WM_GETTEXTLENGTH 得到原本的長度, 再送出 WM_PASTE,再比對後來的文字長度是否相同, 若不同的話就代表有貼上了,那我的目的也達到了。 可是剛才試了一下,我送出 WM_PASTE 給筆記本,可以正確顯示, 但是送給其他軟體如 Word, MSN, 網頁,卻又失敗了 < >< > 真搞不懂是為什麼.
嗯,不確定你的作法,可以先po出來研究研究嗎? 嗯,先這樣了,感覺我們討論的問題不太吻合,可能想的有落差,再研究研究囉!
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-23 23:17:56 IP:211.74.xxx.xxx 未訂閱
引言: 送出字元會顯示出來(表示成功呀),那麼〝失敗〞是指??
例如我送出字元到記事本,可以正常顯示, 可是送到 MSN 或是 Skype,卻是亂碼,所以我說它失敗了 :(
引言:
引言: 是的,我是指 MSN messenger 打字的地方。 我就是在 MSN messenger 跟 Skype 遇到問題。 它們可以接受我送出的字元,卻不能依我預期的顯示出來, 所以我才希望找個偵測是否為editable元件的方法, 這樣就能用貼上的方式來正常顯示了。 為什麼 MSN 跟 Skype 這麼奇怪呢 :(
接受卻不能依預期顯示出來?是指?? 最近我剛好在試寫messenger的auto-replying,我送字串到打字的地方(RichEdit20W元件)還ok啊!
就是會變成亂碼,所以我說接受卻不能依預期顯示 :) 您說您的方法還ok,不知大哥您是怎麼寫的呢? 底下就是我送出字串的程式碼,還請各位幫我檢查檢查了 < class="code"> Clipboard()->AsText = ListBox1->Items->Strings[ListBox1->ItemIndex]; // 把要送出的文字複製起來 BringWindowToTop(LastEditHandle); // LastEditHandle 是目的視窗handle // SetForegroundWindow(LastEditHandle); if( AttachThreadInput(GetCurrentThreadId(), GetWindowThreadProcessId(LastEditHandle, NULL), true) ) { BringWindowToTop(LastEditHandle); // SetForegroundWindow(LastEditHandle); Application->ProcessMessages(); hFocusWin = GetFocus(); // 用來得到要送達的元件的 handle AttachThreadInput(GetCurrentThreadId(), GetWindowThreadProcessId(LastEditHandle, NULL), false); if( hFocusWin != NULL ) { int oriLen = SendMessage(hFocusWin, WM_GETTEXTLENGTH, 0, 0); SendMessage(hFocusWin, WM_PASTE, 0, 0); int newLen = SendMessage(hFocusWin, WM_GETTEXTLENGTH, 0, 0); if (newLen != oriLen) // 元件的字串長度沒變 { // 就用別的方式送出字串 } } } 我測試的結果是,newLen 總是等於 oriLen --
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
系統時間:2024-04-27 20:14:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!