2014-04-13 70 views
0

我們有一個C#2012 WCF服務,它與VB6中構建的桌面應用程序進行交互的次數不少,並且在使用Windows API調用進行下拉選擇時遇到問題。Windows API調用CB_SELECTSTRING

實際上,當應用程序在其中工作時,應用程序的工作方式是首先在下拉框中選擇一個條目。然後在下面的文本框中輸入信息。您在下拉框中選擇另一個條目,將這些字段重置爲空白文本框。下游應用程序中的代碼將文本框信息與下拉列表中的選擇相關聯。這就是特定的應用程序的作品。

我們的問題是自動執行此過程。我們使用的Win32 API調用在下降到設定信息下使用下列內容:

[DllImport("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int uMsg, [Out] int wParam, string lParam); 

// Actual call to the downstream app. 
SendMessage(hWnd, (int)CB_SELECTSTRING, 0, strValue); 

的問題是,當我們嘗試設置在下拉框中的第二個值。文本框未被重置。我們也嘗試過使用以下調用:

SendMessage(hWnd, (int)CB_SELECTSTRING, -1, strValue); 
SendMessage(hWnd, (int)CB_SETCURSEL, 0, strValue); 
SendMessage(hWnd, (int)CB_SETCURSEL, -1, strValue); 

這些消息都沒有完成任務。我們需要調用來模擬Selected Index Changed事件。我們在這裏沒有使用正確的作品嗎?或者我們是否需要向父母發送消息來解除該事件?

我翻遍了我們的解決方案,沒有找到CBN_SELCHANGE任何地方或任何API調用,將它發送給父母。

這裏的任何想法的人?

+0

可能不相關,但你的sendmessage的聲明看起來很腥http://pinvoke.net/default.aspx/user32/SendMessage.html – dkackman

+0

看看在vb6應用程序中檢索組合框的hwnd的代碼是有幫助的 – dkackman

+1

這些消息不能按原樣工作,所傳遞的字符串指針僅在您的進程中有效,而不是在vb6進程中有效。要使字符串指針有效,需要很多很多的代碼。不要去那裏,而是使用UI自動化庫。 –

回答

0

我不確定在這種情況下應該觸發通知CBN_SELCHANGE。一旦以編程方式更改組合框中的某些內容,您將更容易從代碼的下一行更改表單上的其他內容。做同樣的事情扔通知只會使代碼複雜化。認爲你正在編寫這種形式的代碼。

一旦你能夠訪問組合框的hWnd,你也許應該使用相同的SendMessage更新你的輸入字段。

其他方法 - 自己發送CBN_SELCHANGE。沒有什麼反對的。這只是一個消息。

CB_SETCURSEL沒有使用LPARAM。你應該在那裏通過0。

您還應該重新檢查.Net如何編組您的字符串。我不確定這會如此簡單。要驗證這個構建你自己的小dll,檢查定義到DllImport("myUser32.dll")並在調試器中輸入一個斷點SendMessage。你會看到什麼來到本機代碼。

+0

我對這種困惑表示歉意。在我正確編輯這些消息之前,我複製並粘貼並提交了提交。 –