2008-12-22 20 views
0

在win32中,如何爲RichEdit設置回調機制我沒有創建自己?如何在win32中爲RichEdit設置回調機制

PART 1

I'm reading from a textedit field in another application's GUI。這現在工作得很好,除了第一次讀取後,我只想獲取新的或修改過的行。在GTK +或Qt中,我只是在某些信號上安裝一個回調函數,當它發生變化時它會被編輯,但它在Win32上如何工作?

我的MSDN搜索結果沒有任何用處,可能是因爲我不知道搜索的確切術語。該文本的類是RichText20W,它有一些可能以某種方式使用的messages,儘管該文章僅討論將它們用於該類的父類。

PART 2

此外,如果有沒有這樣的「文本已改變,這裏是新插入的文本」回調後者立即返回新的內容,我需要一些方法來輕鬆地檢測是什麼新。從頂部開始:

  1. 在我們閱讀的文本塊的末尾有一個標記,並且只在該文本塊和結尾之間讀取。
  2. 保存我們以前閱讀過的內容,並在第二次閱讀後,從後者中刪除重複部分以獲得新插入的內容。

選項2可能不可行,因爲textedit可以包含任意數量的文本。標記部分聽起來是可行的,但是再一次,我微弱的Win32技能和可怕的Win32函數名稱阻止我找到正確的方式來做到這一點。

請注意,所有這些必須是可行的文本編輯我不要自己並沒有創建,他們屬於第三方進程。

C++中的代碼示例值得高度讚賞。

免責聲明

顯然,如果有做一些更好的方法,讓我知道。根據我以前使用GTK +/Qt的經驗,我只是假設回調將是一條路。隨時給我看看路徑:)

+0

「不擁有」是指另一個過程嗎?或者只是另一個窗口在你的過程中運行? – 2008-12-22 07:51:55

回答

1

Win32控件不適用於您可以訂閱的特定於消息的回調。當事情發生時,他們只是發送消息到他們的父窗口,在這種情況下,EN_UPDATE,EN_CHANGE和所有。即使這些事件也不會告訴你什麼文字發生了變化。他們只告訴你做了的更改。

您可以對父類進行子類化,但SetWindowLongPtr的文檔明確指出「不應該子類化由另一個進程創建的窗口類」。像這樣的東西可能用鉤子,但我還沒有用它們足以說明你是如何做到的。

0

根據Joel的回答,我放棄尋找回調函數,並且創建了一個小類,它將自身掛鉤(不是通過真正的API鉤子)到RichEdit並每秒輪詢一次內容長度,如果它已經改變自上次投票以來,它會要求提供內容,將其與以前已知的內容進行比較,併發出包含已更改內容的信號。

這似乎工作正常,但如果有人知道一個更好的方法仍然(一些真正的和經過測試的方式通過API掛鉤或其他),請張貼。

1

我意識到這是一箇舊帖子,但this文章似乎在做類似的事情。