16,471
社区成员
发帖
与我相关
我的任务
分享
pWnd->SetForegroundWindow();
::SendMessage(hButton,WM_SETFOCUS,0,0);
INPUT m_InPut[1]={0};
m_InPut[0].ki.wVk=0x67;
m_InPut[0].ki.dwFlags=KEYEVENTF_KEYUP;
SendInput(1,m_InPut,sizeof(INPUT));
发按键消息也不行HWND MyFindListViewWindow()
{
const int MyMaxParentWinCount = 2;
// 父窗口类名数组
char *A_szClassName[MyMaxParentWinCount] = {
//"PTA_HaFas_Frame4194304",
"#32770",
"PTA_HaFas_A_OList"
};
// 父窗口标题数组
char *A_szWinName[MyMaxParentWinCount] = {
//"HAFAS",
"Arrival/Departure table",
"HCONLIST.BMP"
};
// 首先求得顶级父窗口
HWND hMainWin = FindWindow(A_szClassName[0], A_szWinName[0]);
if (NULL==hMainWin) {
return NULL;
}
// 逐次用FindWindowEx函数求出各级子窗口
HWND hNextChildWin=NULL;
HWND hLastWin=NULL;
for (int i=1; i<MyMaxParentWinCount; i++) {
if (1==i) {
hLastWin = hMainWin = FindWindowEx(hMainWin,NULL ,A_szClassName[i],A_szWinName[i]);
} else if (2==i) {
hNextChildWin = FindWindowEx(hMainWin,hNextChildWin,A_szClassName[i],A_szWinName[i]);
hLastWin=hNextChildWin;
} else {
hLastWin = FindWindowEx(hLastWin,NULL ,A_szClassName[i],A_szWinName[i]);
}
}
return hLastWin;
}
//---------------------------------------------------------------------------
void MyGetListViewItem(HWND hWindow,TStrings *strlist)
{
const nMaxLen=1023;
char szBuf[nMaxLen+1];
char buf[nMaxLen+1];
int nLVItemCount;
int nColumns;
DWORD dwProcessID;
HANDLE hProcess;
HANDLE hHeaderCtrl;
LVITEM lvItemLocal;
HDITEM hdItemLocal;
DWORD dwBytesRead, dwBytesWrite;
bool bSuccess,bWriteOK;
//注意:本文来自www.ccrun.com,by ccrun(老妖),转载请注明出处。
//本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=583&d=eahk4z
//为防止某些不负责任的转载者,故出此下策,在代码中加入声明,请大家原谅。
GetWindowThreadProcessId(hWindow,&dwProcessID);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);
if(!hProcess) //得不到指定进程的句柄
return;
//在指定进程内分配存储空间
LPVOID lpTextRemote=VirtualAllocEx(hProcess,NULL,nMaxLen+1,MEM_COMMIT,PAGE_READWRITE);
LPVOID lpListItemRemote=VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
LPVOID lpHeadItemRemote=VirtualAllocEx(hProcess,NULL,sizeof(HDITEM),MEM_COMMIT,PAGE_READWRITE);
if((!lpTextRemote) || (!lpListItemRemote) || (!lpHeadItemRemote)) //不能在指定进程内分配存储空间
return;
nLVItemCount=ListView_GetItemCount(hWindow);
hHeaderCtrl=ListView_GetHeader(hWindow);
nColumns=Header_GetItemCount(hHeaderCtrl);
if (nColumns<=0) {
nColumns=1;
} else {
buf[0]=0;
for (int j=0;j<nColumns;j++) {
ZeroMemory(szBuf,nMaxLen+1);
bWriteOK= WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,nMaxLen+1,(LPDWORD)&dwBytesWrite);
if(!bWriteOK) //写内存错误
return;
hdItemLocal.mask=HDI_TEXT;
hdItemLocal.cchTextMax=nMaxLen;
hdItemLocal.pszText=(LPTSTR)lpTextRemote;
dwBytesWrite=0;
bWriteOK=WriteProcessMemory(hProcess,lpHeadItemRemote,(LPVOID)&hdItemLocal,sizeof(HDITEM),(LPDWORD)&dwBytesWrite);
if(!bWriteOK) //写内存错误
return;
SendMessage(hHeaderCtrl,HDM_GETITEM,(WPARAM)j,(LPARAM)lpHeadItemRemote);
bSuccess=ReadProcessMemory(hProcess,lpTextRemote,szBuf,nMaxLen+1,&dwBytesRead);
//从指定进程存储空间读取文本
if(!bSuccess) //不能在指定进程内读取文本
return;
if (j>0) strcat(buf,"|");
strcat(buf,AnsiString(szBuf).c_str());
}
strlist->Add(buf);
}
// strlist->Add("ListView的Columns数: " + String(nColumns));
// strlist->Add("---------------------------");
for (int i=0;i<nLVItemCount;i++) {
buf[0]=0;
for (int j=0;j<nColumns;j++) {
ZeroMemory(szBuf,nMaxLen+1);
bWriteOK= WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,nMaxLen+1,(LPDWORD)&dwBytesWrite);
if(!bWriteOK) //写内存错误
return;
lvItemLocal.iItem=i;
lvItemLocal.iSubItem=j;
lvItemLocal.mask=LVIF_TEXT;
lvItemLocal.cchTextMax=nMaxLen;
lvItemLocal.pszText=(LPTSTR)lpTextRemote;
dwBytesWrite=0;
bWriteOK=WriteProcessMemory(hProcess,lpListItemRemote,(LPVOID)&lvItemLocal,sizeof(LVITEM),(LPDWORD)&dwBytesWrite);
if(!bWriteOK) //写内存错误
return;
SendMessage(hWindow,LVM_GETITEMTEXT,(WPARAM)i,(LPARAM)lpListItemRemote);
bSuccess=ReadProcessMemory(hProcess,lpTextRemote,szBuf,nMaxLen+1,&dwBytesRead);
//从指定进程存储空间读取文本
if(!bSuccess) //不能在指定进程内读取文本
return;
if (j>0) strcat(buf,"|");
strcat(buf,AnsiString(szBuf).c_str());
}
strlist->Add(buf);
}//end of for(i)
//在指定进程内释放存储空间
VirtualFreeEx(hProcess,lpHeadItemRemote,0,MEM_RELEASE);
VirtualFreeEx(hProcess,lpListItemRemote,0,MEM_RELEASE);
VirtualFreeEx(hProcess,lpTextRemote,0,MEM_RELEASE);
//关闭指定进程句柄
CloseHandle(hProcess);
}