问题描述
- C#获取句柄内容的相关问题
-
通过spy++已经得到 TStringGrid 的句柄 用C# 如何能得到 TStringGrid 中的数据 谁有实例
解决方案
TStringGrid 不行,因为它内部没有句柄,是画上去的。除非用ReadProcessMemory直接读内存。但是你需要先调试得到它数据所在位置的偏移地址。
解决方案二:
参考一下这段代码
以前做个这个,不过是C++的,使用了hook方法。
你可以参考
下载完了,运行Exec这个程序,是TStringGrid的示例,运行EnumControls.exe,
点击【列举窗体中的控件】按钮,就获取了TStringGrid的句柄,
点击【复制SG中的数据】就可以把Exec这个程序中TStringGrid的数据复制到EnumControls.exe了。
核心代码是这个:
HWND DLLHWND;
void __stdcall (*InstallHook)(HWND, HWND);
void __stdcall (*UninstallHook)();
char * __stdcall (*GetHookedCell)();
DLLHWND = LoadLibrary("HookSG.dll");
InstallHook = (void (__stdcall *)(HWND, HWND))GetProcAddress(DLLHWND, "InstallHook");
UninstallHook = (void (__stdcall *)())GetProcAddress(DLLHWND, "UninstallHook");
GetHookedCell = (char * (__stdcall *)())GetProcAddress(DLLHWND, "GetHookedCell");
//AnsiString StrHwnd = SG->Cells[2][SelectedRow];
//if (StrHwnd == "") return;
//HWND hWnd = (void *)(StrHwnd.ToInt());
//HWND hParent = GetParent(hWnd);
//HWND hParent = FindWindow("TForm1", "列举窗体中的控件");
//HWND hParent = FindWindow("TForm1", "Form1");
//HWND hParent = FindWindow("TFrmSGHooked", "StringGrid to be hooked");
char cText[MAX_PATH] = {0};
strcpy(cText, Edit1->Text.c_str());
if (strcmp(cText, "") == 0) return;
HWND hParent = FindWindow(NULL, cText);
HWND hWnd = FindWindowEx(hParent, 0, "TStringGrid", NULL);
if (!hWnd) return;
InstallHook(Handle, hWnd);
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
PostMessage(hParent, WM_NULL, 0, 0);
for (int i = 0; i < 20; i++)
{
Sleep(100);
Application->ProcessMessages();
if (MsgWnd != 0) break;
}
if (MsgWnd == 0) goto Exit;
int iRow, iCol, iLen;
iRow = SendMessage(MsgWnd, CM_QUERYROW, 0, 0);
iCol = SendMessage(MsgWnd, CM_QUERYCOL, 0, 0);
if (iRow <= 0 || iCol <= 0) goto Exit;
SGSub->RowCount = iRow;
SGSub->ColCount = iCol;
for (int i = 0; i < iRow; i++)
{
for (int j = 0; j < iCol; j++)
{
iLen = SendMessage(MsgWnd, CM_HOOKCELL, j, i);
if (iLen < 0) goto Exit;
SGSub->Cells[j][i] = GetHookedCell();
}
}
Exit:
MsgWnd = 0;
UninstallHook();
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
FreeLibrary(DLLHWND);
解决方案三:
不是所有的控件都提供API接口支持外部存取数据。很大的可能是没有接口的内部数据,无法取得。
解决方案四:
可以参考这个,别人有做过一些尝试
http://bbs.csdn.net/topics/370135676
时间: 2024-08-04 02:20:23