問題背景:
做了CS項目來完成word的實時同步,如某個客戶端(A)輸入一個字(句子),另一個客戶端(B)顯示了這個字(句子)。
word操作過程中使用的Range對象的InsertAfter來完成插入,最後通過Range的Select函數來完成定位到光標處,這樣客戶B就能實時的看到客戶端A輸入的內容。
但現在的問題是Select會搶光標焦點。如客戶端(B)自己打開了任意doc文件在編輯,在編輯的過程中焦點老是被客戶端B中的word搶去。
實驗根據現象,發現可能的方案:
一 :不同winword.exe進程中的word相互不搶焦點。
發現通常情況下,任務管理器中只有一個winword.exe。如果讓客戶端B中的word使用單獨的一個winword.exe即不會搶焦點。此方法存在一個問題,用戶通過雙擊doc文件打開word時,會依附於任務管理器中的任一個winword.exe。那麼就會出現客戶端B中使用的word對應的winword.exe與雙擊doc文件打開的word對應一個winword.exe相同。此問題暫時不知怎麼解決。
二: word對象模型中的Pane對象的PageScroll不會搶焦點。
那麼就可以使用PageScroll來實現將當前窗口挪動到Range位置來實現定位的功能。
思路大概是:
1)獲得Range所在的頁,以及所在頁中的百分比位置。
2)將窗口挪到Range所在的頁
3)根據Range在上半頁還是下半頁,來使窗口不動還是微調半頁。
具體:
1)獲得Range所在的頁,以及所在頁中的百分比位置。
Range的GetInformation(wdActiveEndPageNumber)方法來獲得range所在頁。
Range的GetInformation(wdVerticalPositionRelativeToPage)方法及GetPageSetup()->GetPageHeight()方法來得到百分比。
2)將窗口挪到Range所在的頁。
調用View的PutDisplayPageBoundaries(TRUE)
調用Window的PageScroll將窗口先挪到首頁。(此函數執行時用try catch包住,因爲在沒有上頁時執行此操作會拋異常)
再Window的PageScroll將窗口挪動到Range所在頁。
3)
調用Window的SmallScroll來微調。正常頁面情況下40,50下爲半頁。
在100頁範圍內可使用GetVerticalPercentScrolled來做一些邏輯,能基本準確定位。
三:
直接調用Window的ScrollIntoView方法。此方法的參數爲Range對象。
最終採用方案三