2011-09-28 96 views
4

我想創建一個應用程序來更改Windows 7中的默認播放設備。唯一的解決方案是與聲音小程序進行交互。我成功地獲得了具有設備名稱但無法從ListView中獲取文本的SysListView32窗口的句柄。從其他窗口獲取ListView項目文本

這是所使用的代碼:

IntPtr sListView = (window handle received from another function) 
LVITEM lvi = new LVITEM(); 
lvi.mask = LVIF_TEXT; 
lvi.cchTextMax = 1024; 
lvi.iItem = 0; // i tried with a loop trought all the items 
lvi.iSubItem = 0; 
lvi.pszText = Marshal.AllocHGlobal(1024); 

IntPtr ptrLvi = Marshal.AllocHGlobal(Marshal.SizeOf(lvi)); 
Marshal.StructureToPtr(lvi, ptrLvi, false); 

SendMessage(sListView, (int)WinMesages.LVM_GETITEMW, IntPtr.Zero, ptrLvi); 

string strLvi = Marshal.PtrToStringAuto(lvi.pszText); 

結果(strLvi)一些中國字母。腳本中有什麼錯誤?

UPDATE:LVITEM結構是這樣的:

private struct LVITEM 
{ 
    public uint mask; 
    public int iItem; 
    public int iSubItem; 
    public uint state; 
    public uint stateMask; 
    public IntPtr pszText; 
    public int cchTextMax; 
    public int iImage; 
    public IntPtr lParam; 
} 

的sLIstView手柄是正確的......間諜一查++。 我需要執行哪些測試來檢查問題出在哪裏?如果有幫助,我可以給你所有的腳本。

回答

1

您是否嘗試過使用LWM_GETITEMTEXTW?

+0

是的,我試過..相同的東西 – Sp3ct3R

+0

@ Sp3ct3R:比字符串編碼?你可以嘗試使用PtrToStringUni/PtrToStringAnsi而不是PtrToStringAuto嗎? –

+0

還有另一個字符,但不可辨認。我曾嘗試使用LWM_GETITEMTEXTW和LWM_GETITEMW,就像在我的原始帖子中一樣。感謝回覆。 – Sp3ct3R