如題,網上有c++取Listview內容的代碼,也能取到,但是想對外部程式發送訊息,使Listview自己選中第一條記錄
uj5u.com熱心網友回復:
uses CommCtrl;var
Item: TLVItem;
begin
p := VirtualAllocEx...//在目標行程分配記憶體
Item.stateMask := LVIS_SELECTED;
Item.state := LVIS_SELECTED;
WriteProcessMemory...//將本行程Item資料拷貝到目標行程的p位置
SendMessage(hwndLV{目標ListView句柄}, LVM_SETITEMSTATE, 0{第1條記錄}, Integer(p))
end;
uj5u.com熱心網友回復:
參考這個http://blog.csdn.net/xuplus/article/details/2294362
uj5u.com熱心網友回復:
把http://blog.csdn.net/xuplus/article/details/2294362綜合修改了下,用任務管理器測驗通過
uses Commctrl;
// 查找視窗 SysListView32
function MyFindWindow: THandle;
const
// 父視窗類名陣列
A_szClassName: array[0..2] of PChar = (
'#32770',
'#32770',
'SysListView32'
);
// 父視窗標題陣列
A_szWinName: array[0..2] of PChar = (
'Windows 任務管理器',
'',
'任務'
);
var
i: Integer;
hLastWin: THandle;
begin
// 首先求得頂級父視窗
hLastWin := FindWindow(A_szClassName[0], A_szWinName[0]);
// 逐次用FindWindowEx函式求出各級子視窗
for i := 1 to 2 do
begin
hLastWin := FindWindowEx(hLastWin, THandle(nil),
A_szClassName[i], A_szWinName[i]);
end;
result := hLastWin;
end;
procedure TForm1.SetItemSelected(nItemIndex: Integer);
var
LVI_1: TLVItemA;
pLVI_2: PLVItemA;
nRet: LongBool;
tagPId: DWORD;
tagPHandle: THandle;
tagHwnd: THandle;
lpNumOfBytesW: Cardinal;
begin
tagPId := 0;
tagPHandle := 0;
tagHwnd := 0;
lpNumOfBytesW := 0;
tagHwnd := FindWindow('#32770', 'Windows 任務管理器');
if tagHwnd < 1 then
Exit;
try
GetWindowThreadProcessId(tagHwnd, @tagPId); // 取行程ID
tagPHandle := OpenProcess(
PROCESS_ALL_ACCESS, False, tagPId); // 獲取行程句柄
except
CloseHandle(tagPHandle);
end;
try
// 向目標遠程目標行程申請記憶體空間
pLVI_2 := VirtualAllocEx(
tagPHandle, nil, SizeOf(TLVItemA), MEM_COMMIT, PAGE_READWRITE);
Assert((pLVI_2 <> nil), '遠程記憶體申請失敗');
LVI_1.mask := LVIF_STATE;
LVI_1.iSubItem := 0;
LVI_1.state := LVIS_SELECTED or LVIS_FOCUSED;
LVI_1.stateMask := LVIS_SELECTED or LVIS_FOCUSED;
nRet := WriteProcessMemory(// 將本地行程中的結構寫入到目標行程
tagPHandle, pLVI_2, @LVI_1, SizeOf(TLVItemA), lpNumOfBytesW);
Assert((nRet), '目標行程寫入失敗');
tagHwnd := MyFindWindow;
if tagHwnd < 1 then
Exit;
SendMessage(tagHwnd, LVM_SETITEMSTATE, Integer(nItemIndex),
Integer(pLVI_2));
except
VirtualFreeEx(tagPHandle, nil, SizeOf(PLVItem), MEM_FREE);
end;
CloseHandle(tagPHandle);
VirtualFreeEx(tagPHandle, nil, SizeOf(PLVItem), MEM_FREE);
end;
//用XP的任務管理器做測驗
procedure TForm1.btn1Click(Sender: TObject);
begin
// 選中任務管理器->應用程式 下的第2項,
SetItemSelected(1);
end;
uj5u.com熱心網友回復:
你說的我能實作 現在是灰色的選中。而不是正常我們自己寫的那種藍色的選中 我不是想加高亮。當點擊的時候會有一個edit框顯示它的值,但是我用Sendmessage發送選中只是灰色的調而且Edit沒有反應。
uj5u.com熱心網友回復:
LVM_EDITLABEL轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130129.html
上一篇:delphi調vc的dll,dll函式的引數是delphi關鍵字怎么辦?
下一篇:多執行緒定時重復創建的問題
