كيفية تحديد عنصر في listview الذي يسمح فقط 1 العنصر المحدد في وقت

StackOverflow https://stackoverflow.com/questions/1081979

  •  22-08-2019
  •  | 
  •  

سؤال

ولقد تم في محاولة لتحديد عنصر على listview الخارجي ولكن يبدو أن تعمل فقط مع listviews التي تقبل العناصر المحددة متعددة:

HANDLE process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, 0xC30); 

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); 
 int abc = ::SendMessage((HWND)0x00080D6A, LVM_SETITEMSTATE, (WPARAM)0, (LPARAM)_lvi); 
 VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
هل كانت مفيدة؟

المحلول

والتعليمات البرمجية الخاصة بك تبدو صحيحة، ويجب أن تعمل، لقد اختبرت داخليا داخل بلدي تطبيق GUI نفسها، لذلك ربما كانت المشكلة في محاولة للوصول من خارج العملية الفعلية. لقد لاحظت أن لديك الثابت ترميز في HWND ليكون ListView. كما أود أن تكون حذرا مع حقيقة أنك الإفراج الفوري عن الذاكرة الظاهرية بعد إرسال الرسالة. تذكر أن الرسالة المرسلة سوف يتم نشرها (على افتراض HWND هو الصحيح) إلى مضخة رسالة ListView. قد لا يكون الاهتمام بها على الفور وبحلول الوقت الذي هو، هناك فرصة جيدة كنت قد صدر بالفعل ذكرى LVITEM. انها محاولة داخليا ضمن واجهة المستخدم الرسومية، تأكد من حصولك على أن العمل، ثم أود أن أقترح العودة إلى هذا النهج وتحديد نقاط التصحيح المناسبة (ضمن واجهة المستخدم الرسومية، إذا كان هذا هو شخص آخر، جعل بنفسك الحوار الخاص بسيط مع listView) لجعل تأكد من أن يتم استلام الرسالة بشكل مناسب، وأن الذاكرة صالحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top