1,486
社区成员
发帖
与我相关
我的任务
分享
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim hwnd0 As Integer = 0
hwnd0 = FindWindow(vbNullString, “B程序")
Dim hwnd1 As Integer = 0
hwnd1 = FindWindowEx(hwnd0, 0&, "Button", "设定变量") '不管把Button改成别的hwnd1都是为零
End Sub
aWnd = FindWindow("notepad", vbNullString)
If aWnd = 0 Then
Shell "notepad.exe", vbNormalNoFocus
aWnd = FindWindow("notepad", vbNullString)
End If
Dim editWnd As Long
editWnd = FindWindowEx(aWnd, 0, "edit", vbNullString)
Dim stmp As String, c As String
stmp = Text1.Text
For i = 1 To Len(stmp)
c = Mid(stmp, i, 1)
call PostMessage(editWnd, WM_CHAR, CLng(Asc(c)), 0)
'WM_SETTEXT 失败,为乱码
Sleep 100
Next
void MyGetListViewItem(HWND hWindow) {
int nLVItemCount;
int nColumns;
DWORD dwProcessID;
HANDLE hProcess;
HWND hHeaderCtrl;
LVITEM lvItemLocal;
HDITEM hdItemLocal;
DWORD dwBytesRead, dwBytesWrite;
BOOL bSuccess,bWriteOK;
LPVOID lpTextRemote;
LPVOID lpListItemRemote;
LPVOID lpHeadItemRemote;
int i,j;
GetWindowThreadProcessId(hWindow,&dwProcessID);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);
if (!hProcess) goto ABORT0;
lpTextRemote=VirtualAllocEx(hProcess,NULL,nMaxLen+1,MEM_COMMIT,PAGE_READWRITE);
if (!lpTextRemote) goto ABORT1;
lpListItemRemote=VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
if (!lpListItemRemote) goto ABORT2;
lpHeadItemRemote=VirtualAllocEx(hProcess,NULL,sizeof(HDITEM),MEM_COMMIT,PAGE_READWRITE);
if (!lpHeadItemRemote) goto ABORT3;
nLVItemCount=ListView_GetItemCount(hWindow);
hHeaderCtrl =ListView_GetHeader(hWindow);
nColumns =Header_GetItemCount(hHeaderCtrl);
// init();
if (nColumns<=0) {
nColumns=1;
} else {
ln[0]=0;
for (j=0;j<nColumns;j++) {
ZeroMemory(szBuf,nMaxLen+1);
bWriteOK= WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,nMaxLen+1,(LPDWORD)&dwBytesWrite);
if (!bWriteOK) goto ABORT4;
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) goto ABORT4;
SendMessage(hHeaderCtrl,HDM_GETITEM,(WPARAM)j,(LPARAM)lpHeadItemRemote);
bSuccess=ReadProcessMemory(hProcess,lpTextRemote,szBuf,nMaxLen+1,&dwBytesRead);
if (!bSuccess) goto ABORT4;
if (j>0) strcat(ln,"|");
strstrip(szBuf1,szBuf);
strcat(ln,szBuf1);
}
add1(ln);
}
// printf("ListView的Columns数: %d\n",nColumns);
// printf("---------------------------\n");
for (i=0;i<nLVItemCount;i++) {
ln[0]=0;
for (j=0;j<nColumns;j++) {
ZeroMemory(szBuf,nMaxLen+1);
bWriteOK= WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,nMaxLen+1,(LPDWORD)&dwBytesWrite);
if (!bWriteOK) goto ABORT4;
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) goto ABORT4;
SendMessage(hWindow,LVM_GETITEMTEXT,(WPARAM)i,(LPARAM)lpListItemRemote);
bSuccess=ReadProcessMemory(hProcess,lpTextRemote,szBuf,nMaxLen+1,&dwBytesRead);
//从指定进程存储空间读取文本
if (!bSuccess) goto ABORT4;
if (j>0) strcat(ln,"|");
strstrip(szBuf1,szBuf);
strcat(ln,szBuf1);
}
add1(ln);
}
ABORT4:
VirtualFreeEx(hProcess,lpHeadItemRemote,0,MEM_RELEASE);
ABORT3:
VirtualFreeEx(hProcess,lpListItemRemote,0,MEM_RELEASE);
ABORT2:
VirtualFreeEx(hProcess,lpTextRemote,0,MEM_RELEASE);
ABORT1:
CloseHandle(hProcess);
ABORT0:
// over();
return;
}
//---------------------------------------------------------------------------
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'_intCboHwnd是设置变量里ComboBox的句柄,_intTxtHwnd是设置变量里RichTextBox的句柄
SendMessage(_intCboHwnd, CB_SETCURSEL, 0, 0) '指向指定记录号
'SendMessage(_intTxtHwnd, WM_SETFOCUS, 0&, 0&)
SetWindowText(_intTxtHwnd, "0537")
End Sub
我当时也怀疑过是不是句柄不正确导致的,我又重新做了两个窗体Form1和Form2,Form1负责控制,Form2负责接收(Form2里有一个RichTextBox和一个TextBox),但结果一样,就只能更改Form2窗体的标题。
Public Class Form1
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String) As Integer
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hwnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hwnd0 As Integer = 0
‘可以更改Form2的窗体标题
hwnd0 = FindWindow(vbNullString, "Form2")
SetWindowText(hwnd0, "更改1")
‘这是RichTextBox控件,程序执行完后这段后,RichTextBox控件没有任何的变化
hwnd0 = FindWindowEx(hwnd0, 0&, "WindowsForms10.RichEdit20W.app.0.bf7771", "")
SetWindowText(hwnd0, "更改2")
‘这是TextBox控件,程序执行完后这段后,TextBox控件没有任何的变化
hwnd0 = FindWindowEx(hwnd0, 0&, "WindowsForms10.EDIT.app.0.bf7771", "")
SetWindowText(hwnd0, "更改3")
End Sub
End Class
请问各大高手,这该怎么改呢? Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
‘#32770是窗口或对话框的类名,hwnd0~hwnd4均可获取相应的句柄
Dim hwnd0 As Integer = FindWindow(vbNullString, ListBox1.Text)
Dim hwnd1 As Integer = FindWindowEx(hwnd0, 0&, "#32770", "")
Dim hwnd2 As Integer = FindWindowEx(hwnd0, hwnd1, "#32770", "")
Dim hwnd3 As Integer = FindWindowEx(hwnd0, hwnd2, "#32770", "")
Dim hwnd4 As Integer = FindWindowEx(hwnd0, hwnd3, "#32770", "")
Dim hwnd5 As Integer = FindWindowEx(hwnd4, 0&, "Button", "应用")
End Sub
我是先按照B程序的窗体名,用FindWindow函数获取B程序窗体的句柄;然后按照用AccExploer查询出来的结构一层层进入,但到了最后hwnd5还是为零。
我想应该是程序没有写对,导致hwnd5为零,请问各大高手,程序该如何写呢?HWND MyFindListViewWindow()
{
const int MyMaxParentWinCount = 4;
// 父窗口类名数组
char *A_szClassName[MyMaxParentWinCount] = {
"ThunderRT6FormDC",
"ThunderRT6Frame",
"ThunderRT6Frame",
"ListView20WndClass"
};
// 父窗口标题数组
char *A_szWinName[MyMaxParentWinCount] = {
Title,
"",
"",
""
};
// 首先求得顶级父窗口
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) {
hMainWin = FindWindowEx(hMainWin,NULL ,A_szClassName[i],A_szWinName[i]);
} else if (2==i) {
hNextChildWin = FindWindowEx(hMainWin,hNextChildWin,A_szClassName[i],A_szWinName[i]);
if (NULL==hNextChildWin) break;//
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;
}
//---------------------------------------------------------------------------