leihuan1217 2015-07-06 07:51 采纳率: 0%
浏览 1612

C#获取句柄内容的相关问题

通过spy++已经得到 TStringGrid 的句柄 用C# 如何能得到 TStringGrid 中的数据 谁有实例

  • 写回答

4条回答 默认 最新

  • WorldMobile 2015-07-06 08:31
    关注

    参考一下这段代码

     以前做个这个,不过是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);
    
    评论

报告相同问题?

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误