编程开发 购物 网址 游戏 小说 歌词 地图 快照 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 开发 租车 短信 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
移动开发 架构设计 编程语言 互联网 开发经验 Web前端 开发总结
开发杂谈 系统运维 研发管理 数据库 云 计 算 Java开发
VC(MFC) Delphi VB C++(C语言) C++ Builder 其它开发语言 云计算 Java开发 .Net开发 IOS开发 Android开发 PHP语言 JavaScript
ASP语言 HTML(CSS) HTML5 Apache MSSQL数据库 Oracle数据库 PowerBuilder Informatica 其它数据库 硬件及嵌入式开发 Linux开发资料
  编程开发知识库 -> VC(MFC) -> 如何获取自绘按钮的句柄呢? -> 正文阅读
 

[VC(MFC)]如何获取自绘按钮的句柄呢?[第1页]

Spy++可以获取父窗口的标题,父窗口下的按钮确没有标题      
怎么提前那个按钮的句柄呢?  api  hook   textout的实例能介绍介绍吗?

回复:
SetWindowText就可以,对窗口是设置标题栏标题,对控件是设置其文本,Edit控件是奏效的,但是DirectUI没有办法拿控件句柄!

回复:
引用 1 楼 pcradio 的回复:SetWindowText就可以,对窗口是设置标题栏标题,对控件是设置其文本,Edit控件是奏效的,但是DirectUI没有办法拿控件句柄!
 这个是我用软件发送的,用spy++查看的消息
  这个是我自己鼠标点击SPY++的消息
我用软件发送消息  没有效果  是什么原因呢?

回复:
发送的对象错误(根本没发给期望的hWnd)

发送的消息不能跨进程/线程

发送的消息内容所在存储空间不在hWnd所属进程/线程存储空间内

其它原因。

回复:
仅供参考:

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);
}


回复:
再供参考:

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;
}
//---------------------------------------------------------------------------


回复:
引用 3 楼 zhao4zhong1 的回复:发送的对象错误(根本没发给期望的hWnd)

发送的消息不能跨进程/线程

发送的消息内容所在存储空间不在hWnd所属进程/线程存储空间内

其它原因。
hWnd肯定是对的  因为我用SPY++看过  而且模拟鼠标事件是可以的
我软件发送的消息    我用SPY++ 监控了那个按钮的消息   显示是接收到了的  只是没有执行

回复:
发送的消息内容所在存储空间不在hWnd所属进程/线程存储空间内

回复:
引用 7 楼 zhao4zhong1 的回复:发送的消息内容所在存储空间不在hWnd所属进程/线程存储空间内
现在是那个界面上有三个按钮   其中BinaryOptions.Current.10980738  这个按钮发消息能够响应  控制界面大小变化
剩下两个 BinaryOptions.Button.Control.10980738  发消息无反应   老师认为是什么原因呢?

回复:
先确认你软件获取的hWnd无误再说。

回复:
如果按钮是直接在窗体上画出来那是没有句柄的

回复:
在spy++里如果可以看到按钮,用findwindowex是可以获取到

回复:
引用 10 楼 xianglitian 的回复:如果按钮是直接在窗体上画出来那是没有句柄的
如果获取了句柄  确定了有效  因为我用spy++ 突出显示  显示是正确的  
发消息 对方不反应  是什么原因导致的呢?

回复:
引用 11 楼 jacksonfan 的回复:在spy++里如果可以看到按钮,用findwindowex是可以获取到
可以找到  只是无标题  用类名找到了

回复:
先setFocus

回复:
引用 14 楼 schlafenhamster 的回复:先setFocus
这个试了   不行

回复:


        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)); 
 

发按键消息也不行

回复:
directUI绘制的按钮是没有句柄的,  肯定无法获得.
从你spy++截图看, 那个程序 应该是directUI的,   得不到句柄了.

回复:
http://www.autohotkey.com

回复:
引用 12 楼 a3622041 的回复:Quote: 引用 10 楼 xianglitian 的回复:
如果按钮是直接在窗体上画出来那是没有句柄的
如果获取了句柄  确定了有效  因为我用spy++ 突出显示  显示是正确的  
发消息 对方不反应  是什么原因导致的呢?按钮的消息应该发给父窗口而不是按钮本身

回复:
Windows Vista 开始,还有权限问题。如果一个非管理员权限启动的进程给一个管理员权限启动的进程发送消息,也是无效的。

回复:
没响应的可能很多,是否该控件对部分消息进行了屏蔽?是否是dui控件并无实际窗口句柄?

回复:
  VC(MFC) 最新文章
求助 MFC中 picture控件怎样动态改变其大小
vc/mfc 如何读取网页验证码?
MFC进程通信(内存共享)
基于单文档的activeX开发
ado没有注册类,无效指针
基于对话框的ocx如何调用对话框控件状态
怎样让资源浏览器的缩略图通过我的软件来显
求助MFC怎么验证HTTP、SOCK5代理IP的有效性
关于VS2015工程生成问题
刚入门学习atl的activex,怎么在网页显示控
上一篇文章      下一篇文章      查看所有文章
加:2017-10-29 22:16:36  更:2017-10-29 22:31:47 
VC(MFC) Delphi VB C++(C语言) C++ Builder 其它开发语言 云计算 Java开发 .Net开发 IOS开发 Android开发 PHP语言 JavaScript
ASP语言 HTML(CSS) HTML5 Apache MSSQL数据库 Oracle数据库 PowerBuilder Informatica 其它数据库 硬件及嵌入式开发 Linux开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年7日历
2018-7-19 4:23:17
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程开发知识库