1

リスト ビュー コントロールから項目を選択して強調表示したいのですが、次のコードを使用しています。

#include <Windows.h>
#include <commctrl.h>


int main() {
    //Hardcoded Handle to the ListView Windows of Add Printer Dialog
    HWND hwndListView = (HWND)0x000206D6; 
    DWORD dwProcessID;
    ::GetWindowThreadProcessId( hwndListView, &dwProcessID );
    HANDLE process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, dwProcessID); 

    LVITEM lvi;

    LVITEM* _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE); 

    lvi.state = LVIS_FOCUSED | LVIS_SELECTED ;
    lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED ;
    lvi.mask = LVIF_STATE;

    WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL); 
    ::SendMessage(hwndListView, LVM_SETITEMSTATE, (WPARAM)0, (LPARAM)_lvi); 
    VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
}

私が得ている結果は

ここに画像の説明を入力

アイテムが選択されて強調表示される代わりに

ここに画像の説明を入力

何が問題なのか教えてください

4

1 に答える 1

2

ウィンドウにフォーカスを設定できるプロセスには制限があり、ダイアログがアクティブな間、ListView 項目を選択するアプリがこれらの制限を満たさない可能性があります。たとえば、フォーカスされている HWND は、呼び出し元のスレッドのメッセージ キューにアタッチされている必要があります。したがって、強調表示アプリは、別のアプリのウィンドウAttachThreadInput()を呼び出す前に使用する必要があります。SetFocus()

于 2013-09-12T18:42:43.593 に答える