程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 如何選中其他程序ListView控件中的某個Item

如何選中其他程序ListView控件中的某個Item

編輯:關於VC++

一:程序說明:

題目是一位網友在我留言板上的留言,不知道大家看沒看過我曾經寫過的《如何向其他程序的ListView控件發送LVM_GETITEMTEXT消息》一文?在那篇拙文中,我的目的是得到某一Item的TEXT。於是我將LVITEM結構插入到了目標進程中,才使得目標進程正確響應LVM_GETITEMTEXT消息。

要得到某一Item的TEXT,需要發送LVM_GETITEMTEXT消息,而要選中某個Item則要發送LVM_SETITEMSTATE消息:

LVM_GETITEMTEXT
wParam = (WPARAM) (int) iItem;
lParam = (LPARAM) (LV_ITEM FAR *) pitem;
LVM_SETITEMSTATE
wParam = (WPARAM) (int) i;
lParam = (LPARAM) (LV_ITEM FAR *) pitem;

看到了嗎?兩個消息的參數一模一樣!再來看看LV_ITEM結構的設置:只需將state和stateMask設置成LVIS_SELECTED,並指定iItem即可。直接修改上篇拙文中的代碼就能輕松搞定本篇要解決的問題。

作為演示,下面的這段程序將選中TaskManager中第6個項目。

二:具體實踐:

/*
*  Send LVM_SETITEMSTATE
*  版權所有 (C) 2005 天津 趙春生
*  2005.08.04
*  http://timw.yeah.net
*  http://timw.126.com
*  本程序適用於:Win2KP+SP4[Windows TaskManager(5.0.2195.6620)]
*         WinXP+SP1[Windows TaskManager]
*  代碼在Win2000P+SP4 + VC6+SP6測試通過
*/
#include<windows.h>
#include<commctrl.h>
int APIENTRY WinMain(HINSTANCE hInstance,
           HINSTANCE hPrevInstance,
           LPSTR   lpCmdLine,
           int    nCmdShow)
          
{
  
   HWND hwnd;
   int iItem=0;
   LVITEM lvitem, *plvitem;
   DWORD PID;
   HANDLE hProcess;
  
  
   hwnd=FindWindow("#32770","Windows 任務管理器");
   hwnd=FindWindowEx(hwnd,0,"#32770",0);
   hwnd=FindWindowEx(hwnd,0,"SysListView32",0);
   if (!hwnd)
    
     MessageBox(NULL,"[Windows 任務管理器] 尚未啟動!","錯誤!",NULL);
  
   else
   {
       GetWindowThreadProcessId(hwnd, &PID);
      
       hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
       if (!hProcess)
        
         MessageBox(NULL,"獲取進程句柄操作失敗!","錯誤!",NULL);
      
       else
       {
         plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM),
                 MEM_COMMIT, PAGE_READWRITE);
         if (!plvitem)
          
           MessageBox(NULL,"無法分配內存!","錯誤!",NULL);
        
         else
         {
           MessageBox(NULL,"本演示程序將選中TaskManager中的第6個項目。","提示",NULL);
          
           iItem=5;//5在這裡是第六個(從零開始)
           lvitem.state=LVIS_SELECTED;
           lvitem.stateMask=LVIS_SELECTED;
           WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
           SendMessage(hwnd, LVM_SETITEMSTATE, (WPARAM)iItem, (LPARAM)plvitem);
          
         }
       }
     }
  
   //釋放內存
   CloseHandle(hwnd);
   CloseHandle(hProcess);
   VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
  
   return 0;
}

三:以上代碼在Win2000P+SP4 + VC6+SP6測試通過。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved