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

sendmessage 傳遞字串會掉字

答題得分者是:aquarius
fivker
一般會員


發表:24
回覆:38
積分:12
註冊:2006-12-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-01-29 11:25:28 IP:202.3.xxx.xxx 訂閱
大家好:
在使用sendmessag時,將字串傳到記事本時,不是很穩定
比如:
AAA
BBB
CCC

sendmessage到記事本時會變成

AAABBB
CCC

或是
AAA
BBCCC

查了很多天的網路上的資訊,加了sleep與改用postmessage,都有這樣的問題.
不知道是不是我的程式寫法有沒寫好,還是這是sendmessage本身就存在的問題.


附加檔案:4b62552875db9_upload.rar
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-01-29 19:44:20 IP:114.32.xxx.xxx 訂閱
我有抓你的程式測試
用Delphi Step Over的方式trace
會發生你說的情形

下面兩行會傳輸 回車鍵給目前的視窗
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
不過因為正在trace , focused window 為Delphi
所以這兩行傳的命令傳給Delphi了
結果是 Notepad 沒有換到行
我猜你說的不穩定是指 在Delphi 下Run才會這樣

建議你

1.
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
把這兩行mark

2.
memostring:=str[j];
改成
memostring:=str[j] #10;

memostring:=str[j] #13;

3.
另外,你傳輸字串陣列的起始值可以由1開始,不用從0開始
fivker
一般會員


發表:24
回覆:38
積分:12
註冊:2006-12-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-02-01 09:59:35 IP:202.3.xxx.xxx 訂閱
真的非常感謝pprayer,您還費心幫我測程式。

1.
您文中所提之狀況,我有注意到。
在測試時,我是以執行檔去跑,並且避免切換視窗。
以免enter鍵的的訊息,傳到其他視窗。

但仍有一兩筆,會有 「文字」或是「enter」的message消失之狀況。(如第一篇文章之情況)

2.
改用
memostring:=str[j] #10;或
memostring:=str[j] #13;
,我將原本傳遞對象「記事本」改為「listbox」,便無法換行。
真的很神奇,是不是listbox無法辨認 #10與#13???

3.感謝pprayer的提醒,我還沒發現到 哈。




===================引 用 pprayer 文 章===================
我有抓你的程式測試
用Delphi Step Over的方式trace
會發生你說的情形

下面兩行會傳輸 回車鍵給目前的視窗
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
不過因為正在trace , focused window 為Delphi
所以這兩行傳的命令傳給Delphi了
結果是 Notepad 沒有換到行
我猜你說的不穩定是指 在Delphi 下Run才會這樣

建議你

1.
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
把這兩行mark

2.
memostring:=str[j];
改成
memostring:=str[j] #10;

memostring:=str[j] #13;

3.
另外,你傳輸字串陣列的起始值可以由1開始,不用從0開始
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-02-01 20:17:45 IP:114.32.xxx.xxx 訂閱
就我的理解
listbox 這種 listcontrol
把Data的內容 和 繪圖 分開處理

listbox 是一行一行地 drawText 是在Canvas 上把字串畫上去
你字串表現出來是什麼樣 它畫出來就是什麼
所以要表現出換行要 先變更他的Items 然後呼叫 WMPaint 讓物件重畫
fivker
一般會員


發表:24
回覆:38
積分:12
註冊:2006-12-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-02-04 10:18:57 IP:202.3.xxx.xxx 訂閱
原來如此,感謝您的說明.
因為我沒碰過wmpaint,可能需要再花時間研究.

我推測發生原因,可能是因為使用者的電腦過於忙碌,
導致字元傳遞順序錯亂.
原本
AAA enter BBB
變成
AAA BBB ENTER
(以上只是推測)

目前我修改方式
1.
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);

改為
sleep(5);
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
sleep(5);

先以這樣的方式處理.(接下來只希望老天幫幫忙了@@)

===================引 用 pprayer 文 章===================
就我的理解
listbox 這種 listcontrol
把Data的內容 和 繪圖 分開處理

listbox 是一行一行地 drawText 是在Canvas 上把字串畫上去
你字串表現出來是什麼樣 它畫出來就是什麼
所以要表現出換行要 先變更他的Items 然後呼叫 WMPaint 讓物件重畫
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-02-18 22:36:46 IP:114.37.xxx.xxx 訂閱
keybd_event 不建議在 Windows 2000 以上的系統使用, 可以改用 SendInput

可參考這2篇

http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=86597
http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=69142

------
水瓶男的blog: http://791909.blogspot.com
系統時間:2017-12-12 8:31:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!