比较麻烦的问题,求高手出谋划策 现在遇到一个比较棘手的问题我通过VC开发程序,调用一个外部的其他程序的接口,他会弹出一个登录窗口。我想通过VC去实现一个功能,就是通过VC获得这个弹出的登录的窗口,在用户名的Edit中填写默认的用户名我不知道原有的程序接口是通过什么实现的,不知道该如何实现这个功能,希望各位高手帮忙出谋划策,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果接口是在动态链接库中, 需要include其转出函数或类的头文件, 并且需要链接.lib(通常,第三方链接库有一个转入链接库,以.lib为扩展名).如果接口是基于COM组件, 在程序中需要先进行CoInitailize初始化COM,然后, 用CoCreateInstance创建这个组件并得到接口的调用指针, 当然,仍然需要包含相关函数或类的转出头文件. SendMessage/PostMessage WM_SETTEXT 它毕竟是一个窗口FindWindow能找到吗? FindWindow?可是这个需要两个参数,这两个参数的值怎么获得呀? 可以通过EnumWindow或FindWindow找一下这个Edit-box,通常,标准 的Windows CEdit控件, 有固定的ClassName 用Spy++查查那个登录窗口的类名(或者知道窗口名)先用FindWindow打到登录窗口的名柄,然后枚举登录窗口中的子窗口,查找用户名的文本框。找到后SetWindowText FindWindow取得弹窗的句柄然后再用Edit发送设置字符的WM_SETTEXT消息,设置用户名,密码也一样。 VC附带了一个工具叫Spy++,利用这个工具可以查出窗口和控件的类名、ID、窗口之间的关系。用FindWindow可以根据类名或者标题文字来查找窗口;用FindWindowEx利用窗口之间的关系、类名、文字来查找子窗口和控件;也可以用GetDlgItem根据ID来查找控件。向控件发WM_SETTEXT消息可以改变控件文字。 用FindWindow()函数可以根据窗口名找到窗口,然后向找到的窗口发消息WM_SETTEXT来设置用户. EnumChildWindows 枚举字窗口GetClassName 获取窗口类名,判断是否"Edit" 枚举子窗口,查找用户名文本框WM_SETTEXT改变内容 也可以通过进程查找所有字窗口,这个方法很通用。你试试。我曾经用findwindowex,findwindow编过一个程序,方法可行。 谢谢给为高手的帮助,问题已经解决了,解决方法如下(共出现同样问题的人参考):首先通过spy++,查到窗体的类名,title和其下的控件例如类名为A,title为B然后就可以写程序啦//首先写一个回调,用于获得窗体中的控件BOOL CALLBACK EnumChildProc(HWND hwndChild,LPARAM lParam){ TCHAR szClassName[1024]; //ClassName 用于通过句柄获得类名称 GetClassName(hwndChild,szClassName,1024); //GetClassName方法,用于通过句柄获得ClassName CString str = CString(szClassName); //这个不用说了,就是把TCHART转化成CString,我不知道怎么比较TCHAR,有点笨,所以干脆转化成CString if (str == "Edit") //找到Edit控件,可能在其他程序中应用的话,不是Edit,这个类名称可以在spy++中查到(还真是不错的工具) { //由于需要查找的窗体上有两个Edit,为了区分,我写了这个判断,正好我需要填写的那个Edit是没有下一个空间的向,所以我就直接判断下一个控件为空,如果在其他地方应用,还要灵活处理。 if (GetNextWindow(hwndChild,GW_HWNDNEXT) == NULL) { //发送WM_SETTEXT消息,将值填入Edit SendMessage(hwndChild,WM_SETTEXT, 0,(LPARAM)("user")); } } return TRUE;}//这个是我写的一个窗体的按钮事件函数void COpeaWindowDlg::OnGetWindow() { //首先使用FindWindow方法获得窗体,前面说过了,A是类名称,B是title CWnd* STWnd =FindWindow(A,B); HWND hStWnd = STWnd->m_hWnd; //枚举获得子控件,hStWnd是上面获得窗体,EnumChildProc是定义的回调函数(貌似这里很类似函数指针,我是这么理解的),第三个参数我也不知道是什么,就随便写了个NULL EnumChildWindows(hStWnd,EnumChildProc,NULL); UpdateData(TRUE);//更新资源,嘻嘻}就如上面的方法,我把用户名填到了,相应窗口的用户名Edit中啦谢谢各位高手指教,加分谢大家结贴~嘻嘻 MFC在资源中插入 menu 菜单后打开发现变成竖直的如何设置? 如何在工具栏上显示文字 关于EDIT控件的两个问题,求解答。 (讨论)关于获取网络游戏中相关坐标值的问题,高手请进…… 有没有人遇到过CoCreateInstance创建一个COM EXE没有返回的情况? 关于代理服务器编程 请教高手,我的VC为什么不能DEBUG 初学VC有几个小问题想问,分不多了,以后再加。。谢谢 如何改变Dialog按钮字体的颜色和大小????? trunk.exe 这个东东在vc1。52下怎么找不到?100分求之。 请问一个窗口布局问题 求如何处理变体数据
如果接口是基于COM组件, 在程序中需要先进行CoInitailize初始化COM,然后, 用CoCreateInstance创建这个组件并得到接口的调用指针, 当然,
仍然需要包含相关函数或类的转出头文件.
FindWindow能找到吗?
FindWindow?
可是这个需要两个参数,这两个参数的值怎么获得呀?
先用FindWindow打到登录窗口的名柄,然后枚举登录窗口中的子窗口,查找用户名的文本框。
找到后SetWindowText
用FindWindow可以根据类名或者标题文字来查找窗口;用FindWindowEx利用窗口之间的关系、类名、文字来查找子窗口和控件;也可以用GetDlgItem根据ID来查找控件。向控件发WM_SETTEXT消息可以改变控件文字。
GetClassName 获取窗口类名,判断是否"Edit"
WM_SETTEXT改变内容
//首先写一个回调,用于获得窗体中的控件
BOOL CALLBACK EnumChildProc(HWND hwndChild,LPARAM lParam)
{
TCHAR szClassName[1024]; //ClassName 用于通过句柄获得类名称
GetClassName(hwndChild,szClassName,1024); //GetClassName方法,用于通过句柄获得ClassName
CString str = CString(szClassName); //这个不用说了,就是把TCHART转化成CString,我不知道怎么比较TCHAR,有点笨,所以干脆转化成CString
if (str == "Edit") //找到Edit控件,可能在其他程序中应用的话,不是Edit,这个类名称可以在spy++中查到(还真是不错的工具)
{
//由于需要查找的窗体上有两个Edit,为了区分,我写了这个判断,正好我需要填写的那个Edit是没有下一个空间的向,所以我就直接判断下一个控件为空,如果在其他地方应用,还要灵活处理。
if (GetNextWindow(hwndChild,GW_HWNDNEXT) == NULL)
{
//发送WM_SETTEXT消息,将值填入Edit
SendMessage(hwndChild,WM_SETTEXT, 0,(LPARAM)("user"));
}
} return TRUE;
}//这个是我写的一个窗体的按钮事件函数
void COpeaWindowDlg::OnGetWindow()
{
//首先使用FindWindow方法获得窗体,前面说过了,A是类名称,B是title
CWnd* STWnd =FindWindow(A,B);
HWND hStWnd = STWnd->m_hWnd; //枚举获得子控件,hStWnd是上面获得窗体,EnumChildProc是定义的回调函数(貌似这里很类似函数指针,我是这么理解的),第三个参数我也不知道是什么,就随便写了个NULL
EnumChildWindows(hStWnd,EnumChildProc,NULL);
UpdateData(TRUE);//更新资源,嘻嘻
}就如上面的方法,我把用户名填到了,相应窗口的用户名Edit中啦谢谢各位高手指教,加分谢大家结贴~嘻嘻