2012-02-29 54 views
2

這是可能的重複。找不到確切的一個,我記得經歷了很久很久以前。如何以編程方式在運行對象表中註冊Word實例?

該工具需要能夠檢測是否有任何MS Word文件從計算機的任何地方打開。因此,我們使用的過程觀察家,像這樣:

string query = "SELECT TargetInstance FROM __Instance" + Event + "Event WITHIN 0.5 " + 
       "WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = '" + processName + "'"; 

string scope = @"\\.\root\CIMV2"; 

//Create a watcher and listen for events 
watcher = new ManagementEventWatcher(scope, query); 
watcher.EventArrived += eventHandler; 
watcher.Start(); 

現在不管它是什麼,這裏是棘手的部分:我需要獲得當前打開WINWORD過程的自動化一詞實例。所以我使用Marshal.GetActiveObject來獲得運行實例。但是,只有當單詞app失去焦點時(如msdn所記錄),纔會在運行的對象表中註冊一個打開的Word應用程序。如果我有與我在一起的流程,如何手動在ROT中註冊Word應用程序?下面

//process started 
private void ProcessStarted(object sender, EventArrivedEventArgs e) 
{ 
    // Marshal.GetActiveObject fails since there is no object yet. 
    // Process.GetProcessesByName("WINWORD") got it. 
    // now how to register this word process to ROT? 
    // so that I have a global instance of word application? 
} 

注意一些僞代碼:我可以與一些重型API調用編程方式迫使焦點從打開的Word窗口離開,然後把它帶回來,但那是一塌糊塗。

任何正常的註冊方式?

+0

所以沒有解決這個問題?你可以發佈你正在使用的其他選擇嗎? – 2017-12-18 05:59:32

+0

@AniketBhansali對不起,我現在不記得:( – nawfal 2017-12-18 06:03:44

回答

1

據我所知,如果沒有直接合作,就無法在ROT中註冊其他應用程序的對象。該表不跟蹤進程,它跟蹤類工廠及其相關的標記。爲了在ROT中註冊某些東西,你需要它的IUnknown指針,這不是你直接從Word獲得的東西。

相關問題