2010-01-02 16 views
0

我有一個使用的,他們沒有源代碼和公司,開發它不存在任何更舊的,定製的ERP應用的客戶。應用程序是在2000年開發的,它是用Delphi編寫的。由於最後的可執行文件是從2003年開始的,它可能是D6或D7。連接窗口中運行的應用程序

在一個重要的形式,也有一些領域,其中客戶希望顯示來自其他數據庫的其他數據,並問我是否有可能「膠帶」的數據在現有的形式。

的第一個想法是構建應用程序,將:窗目標應用

  • 瀏覽列表中創建並找到控制在形式
  • 重視「一些」事件時得到通知顯示目標表單時
  • 連接時目標表格字段改變
  • 顯示附加信息在小窗口覆蓋目標的形式得到通知「一些」事件時

有沒有對如何做任何這樣的例子。我搜索了谷歌這個問題標題的變化,但沒有成功。

注 - ERP應用程序的重寫是沒有計劃。

關於語言 - 我可以用C#或Delphi做。

+0

Whew。自從我上次在Delphi開發軟件已經有五年了,所以我沒有完全有資格回答,但是當你唯一擁有的是二進制文件時,這聽起來不太可能。我並不是說要高興或者成爲一個聰明人,但是像這樣的事情是開放源碼的論點 - 如果不向公衆開放,那麼至少對付費用戶開放。 – 2010-01-02 13:41:35

+0

你在開發什麼語言? – 2010-01-02 14:11:46

回答

4

我打算從純CWin32的角度回答這個問題,因爲我不知道Delphi或其庫。將它轉換爲C#可以通過p/invoke來完成,但有些部分可能需要不受管理。

首先,沒有保證。如果目標應用程序正在執行無窗口控件(如果在每個屏幕控件下都沒有HWND),那麼您的運行狀況非常糟糕。這是不是所有的罕見,所以是...

步驟1,註冊一個窗口鉤子監聽由目標進程*創建的新窗口:

//dllHMod is an HMODULE that refers to the DLL containing ShellHookProc 
HHOOK hook = SetWindowsHookEx(WH_SHELL, ShellHookProc, dllHMod, 0); 
// error handling, stashing hook away for unregistering later, etc... 

LRESULT CALLBACK ShellHookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if(nCode < 0) return CallNextHookEx(NULL, nCode, wParam, lParam); 

    if(nCode == HSHELL_WINDOWCREATED) 
    { 
    WindowCreate((HWND)wParam); 
    } 

    return 0; 
} 

WindowCreated(HWND)應該藏匿HWND的路程,如果在正確的過程(通過GetWindowThreadProcessId確定)擁有它。此時,您將能夠獲取目標進程擁有的每個頂級窗口。請注意,註冊全局鉤子會帶來顯着的性能損失,而不是它對您的情況非常重要,但您應該期待它。

現在的樂趣部分。沒有可靠的方法來告訴窗口何時完全構建,或者完成了渲染(有些方法可以告訴它什麼時候開始渲染,但這沒有什麼幫助)。我的建議,猜想。只要在這裏拋出一些隨意的等待,然後嘗試枚舉所有的子窗口。

枚舉子窗口(如果你足夠了解目標窗口,有更好的方法來做到這一點,但我假設的搜索是最容易):

//targetHWND is an HWND of one of the top-level windows you've found 
EnumChildWindows(targetHWND, ChildWindowCallback, NULL); 
//more code... 

BOOL ChildWindowCallback(HWND window, LPARAM ignored) 
{ 
    if(IsTargetWindow(window)) { /* Do something */ } 

    return TRUE; 
} 

實施IsTargetWindow是另一個棘手的部分。希望你會找到一些可靠的測試(例如檢查課程名稱,窗口名稱,樣式,看看GetWindowInfo)。

一旦你有你想監視的窗口,你可以使用SetWindowLongPtrGWLP_WNDPROC來收看它收到的所有消息。這將需要代碼注入(因此需要非託管代碼)並且級別非常低。我建議反對它,如果你可以避免它,但缺乏來源...

我認爲這個答案是一個體面的起點,但再次這將是非常痛苦的如果它甚至可能在所有。祝你好運。 *或者,如果您知道目標應用程序不在啓動時(或在可檢測/可預測的時間點)創建窗口,則可以使用EnumWindows

+0

凱文,非常感謝你這個非常詳細的答案。 – zendar 2010-01-02 20:46:26

相關問題