2010-12-16 56 views
0

越來越WM_ACTIVATEAPP我有以下情形:發送WM_COPYDATA但在接收端

我的應用程序在命令行中得到了一些數據。

第一次執行後,我的應用程序總是運行一個實例,該實例將在內存中,直到使用明確指示它關閉,而不是在不需要時隱藏窗體。

當用戶嘗試第二次運行應用程序時,進程開始,檢查內存中是否存在另一個應用程序,如果這是真實的,它將WM_COPYDATA消息發送到內存中的進程命令行並退出。

當它是運行應用程序的用戶時,這一切都很好。

我需要從Microsoft Word 2003工具欄運行它,所以我使用了「插件」。問題是,當我的應用程序從該加載項(使用Process類)啓動時,似乎已經在內存中的進程獲取WM_ACTIVATEAPP消息而不是WM_COPYDATA之一,所以我無法獲取從該加載項發送的所需數據進程由加載項啓動。

我不知道爲什麼會發生這種情況,以及如何解決這個問題。我GOOGLE了幾個小時,沒有任何幫助...

任何人都可以幫忙嗎?

回答

1

獲取WM_ACTIVATEAPP消息是非常正常的,這是Windows發送的通常通知的一部分。不要假設你會得到的第一個消息是WM_COPYDATA,請繼續尋找。如果你根本沒有得到它,那麼你用來發送消息的窗口句柄是錯誤的。這是一個非常普遍的問題,要準確地找回窗口並不容易。

.NET框架已經可以很好地支持單實例應用程序,它可以從第二個實例中檢索命令行。考慮改用它。檢查這個blog post

+0

有點遲來的答案,但它在這裏:謝謝你的答案。我只是收到第一條信息,我應該把它們全部弄清楚,並嘗試找到合適的信息。關於你的建議,我不想在C#應用程序中使用VB的東西,並最終使用MSMQ。不過,我問你:我如何得到所有的消息? WndProc只被調用一次,所以我只收到一條消息...無論如何,感謝您的幫助。 :) +1 P.S. - 我將它標記爲答案,因爲它幫助我找到可能發生的消息,並且給出的建議幫助我找到了MSMQ – osiris 2011-02-27 23:09:58

+0

是什麼讓你認爲這是「VB的東西」?它是用C#編寫的。在.NET中自由混合語言的功能是一項功能,而不是一個錯誤。它沒有傳染性。 – 2011-02-27 23:15:25