如何将一个字符串的内容放到鼠标任意选择的编辑框里,比如:网页的表单等。
如题 问题点数:100、回复次数:29Top
1 楼neccui(PPC)回复于 2002-03-08 21:20:10 得分 0
取得该窗口的句柄,然后发送SetWindowText 消息就可以了吧。Top
2 楼xinxin()回复于 2002-03-08 21:26:03 得分 0
如何获取窗口句柄呢?Top
3 楼neccui(PPC)回复于 2002-03-08 21:31:28 得分 0
FindWindow,EnumWindowsTop
4 楼xinxin()回复于 2002-03-09 15:22:24 得分 0
还是不明白,问题是当前鼠标点击的edit control是怎么确认其句柄呢?Top
5 楼prometheusphinx(白日梦)回复于 2002-03-11 16:23:25 得分 0
最简单的方法就是用keybd_event,当然,其前提条件就是这个edit control要取得输入焦点。Top
6 楼prometheusphinx(白日梦)回复于 2002-03-11 16:25:47 得分 5
举个例子吧,
CString ts = 'sdfasdfsadfsadfsadfhdf)HGfdGH(+_eryer@$3#';
SHORT Vk;
for (int j = 0; j < ts.GetLength(); j++)
{
Vk = VkKeyScan(ts[j]);
if (Vk >> 8 == 1)
{
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(Vk, 0, 0, 0);
keybd_event(Vk, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
}
else
{
keybd_event(Vk, 0, 0, 0);
keybd_event(Vk, 0, KEYEVENTF_KEYUP, 0);
}
}Top
7 楼xinxin()回复于 2002-03-15 19:21:54 得分 0
好象应该用鼠标事件来解决问题吧?
能告诉我捕捉鼠标事件后得到了字符串,但如果没有MessageBox()就不能将字符串送到我希望放的编辑框中的原因是什么?另外,为什么捕捉结束后想关闭捕捉功能会失败呢?Top
8 楼yongdu()回复于 2002-03-15 21:21:03 得分 5
对编辑框,它可以在进程间传递消息,所以
先SetCapture,再得到鼠标所指位置的句柄(有个api),再setwindowText
Top
9 楼wsa_socket()回复于 2002-03-15 21:39:00 得分 5
网页的表单不太好办吧,好像用到com接口Top
10 楼coffeefish(咖啡鱼)回复于 2002-03-15 21:43:33 得分 5
如果是ie的编辑框,以上方法是不行的
它用到com接口
不是想象的那么简单Top
11 楼xinxin()回复于 2002-03-17 20:40:42 得分 0
能SetCapture但不能ReleaseCapture是怎么会事呢?Top
12 楼rouser(流淌的小溪)回复于 2002-03-18 21:24:35 得分 5
WindowFromPoint
SetWindowText
Top
13 楼xinxin()回复于 2002-05-13 15:29:09 得分 0
至今为止,将前面的方法综合起来,还是不能完成我需要的功能。两个多月了没给大家分,实在是不好意思。但很希望能得到完整的解决方案后再结帖,希望能得到谅解。Top
14 楼kingzai(stevenzhu)回复于 2002-05-17 13:45:50 得分 10
这个可以分两种情况。
1。一种是普通的编辑框窗口,可以先得到它的窗口句柄后SendMessage(hwnd,
WM_SETTEXT,buf,0);
2.一种是IE窗口,可以先得到IhtmlDocument2指针,然后遍历表单元素后使用这个接口:
HRESULT IHTMLElement::put_innerText(BSTR v);
Top
15 楼xinxin()回复于 2002-05-18 15:03:24 得分 0
真不容易得到kingzai的回应。我急着解决的是IE的窗口,要想做的是一个网叶自动注册的功能。我没次上网都要用“融海Intranet登录系统”进行登陆,麻烦不说,没次敲键盘有可能让人看到密码,不太方便。就想做个自动注册的小程序,一运行就可以自动注册登陆(最好是自己打开规定的登陆网叶,自己添上注册名和密码最后又自动确认),不知道那位高手能指点迷津?Top
16 楼kingzai(stevenzhu)回复于 2002-05-18 19:49:35 得分 10
这个我可研究过,IE的登陆有好几种方法,一种是利用IE的COM接口,使用填充表单的方法。第二是使用WININET POST表单的方法。这两种方法:可参考:
http://baizhuang.d2g.com/notes.asp?id=604
第三种嘛,可是我自己弄出来的,嘿嘿,直接敲入网址mail.sina.com.cn\logon.cgL&user=xxx&pwd=yyy&...类似这种其实可以直接登陆网站了,(要处理好密码的问题,否则从网址就可以看到了),具体你可以右键反击IE窗口查看网页的源文件就清楚了(主要处理FORM里的内容)Top
17 楼xinxin()回复于 2002-05-21 14:55:25 得分 0
我水平太低,第一种方法我一点也不明白。第二种的地址我暂时进不去。
请kingzai先按照第三种方法指点一下如何解决我的问题。因为登陆时地址栏里只有一个IP地址,不知道如何找到logon.cgi&user=...的格式问题,只好将整个代码拷贝过来,让kingzai给判断一下了。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>融海Intranet登录系统</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="Microsoft Theme" content="none, default">
<meta name="Microsoft Border" content="none, default">
</head>
<body bgcolor="#008080">
<p align="center"><font face="宋体" size="6" color="#FFFF80"><strong>融海Intranet登录系统</strong></font>
</p>
<div align="center"><center>
<table border="5" cellpadding="10" cellspacing="30" width="600" height="330">
<tr>
<td><form ACTION="/cgi-bin/scs_login.cgi" METHOD="post">
<input type="hidden" name="language" value="chinese"><div align="center"><center><p>请输入您的帐号和密码</p>
</center></div><div align="center"><center><p><font color="#80FFFF">帐号:</font><input
TYPE="text" size="10" NAME="username"> <font color="#80FFFF">密码:</font><input
TYPE="password" size="10" NAME="password"> </p>
</center></div><div align="center"><center><p>请选择所需的操作</p>
</center></div><div align="center"><center><p> <input TYPE="radio" NAME="radio"
VALUE="logon" checked><font color="#80FFFF">上网操作</font> <input TYPE="radio"
NAME="radio" VALUE="logoff"><font color="#80FFFF">下网操作</font> <input TYPE="radio"
NAME="radio" VALUE="changepass"><font color="#80FFFF">修改密码</font> <input
TYPE="radio" NAME="radio" VALUE="sumdata"><font color="#80FFFF">流量查询</font></p>
</center></div><div align="center"><center><p><font color="#80FFFF">新密码:</font><input
TYPE="password" size="10" NAME="newpassword"> <font color="#80FFFF">新密码确认:</font><input
TYPE="password" size="10" NAME="newpassword2"> </p>
</center></div><div align="center"><center><p><font color="#80FFFF">请选择要查询的月份:</font><select
name="SearchMonth" size="1">
<option> 一月份 </option>
<option> 二月份 </option>
<option> 三月份 </option>
<option> 四月份 </option>
<option> 五月份 </option>
<option> 六月份 </option>
<option> 七月份 </option>
<option> 八月份 </option>
<option> 九月份 </option>
<option> 十月份 </option>
<option> 十一月份 </option>
<option> 十二月份 </option>
</select> </p>
</center></div><div align="center"><center><p><input TYPE="submit" VALUE=" 确认 "> <input
TYPE="reset" VALUE=" 取消 "> </p>
</center></div>
</form>
</td>
</tr>
</table>
</center></div>
<p align="center"><font color="#FF8000"><big><strong>北京融海诚信咨询有限公司</strong></big></font></p>
<p align="center"><a href="login-english.html">英文界面</a></p>
</body>
</html>
我用如下格式测试失败,找不到该页。http://10.1.0.5/cgi-bin/scs_login.cgi&username="myname"&password="mypassword"&radio="logon"
Top
18 楼kingzai(stevenzhu)回复于 2002-05-21 16:20:20 得分 25
你使用这种直接敲入URL的安全性太低。很容易就在网页中留下了痕迹。帐户和密码很容易就被看到了。我教你一种方法:
写一个ActiveX控件,把帐号和密码放到这个控件里,最后在网页中进行调用。
然后自己定制网页,把ocx给加载进去。
<form method="post" name="frm" target="_blank">
<select name=flag size=1
<option value="163net">163@163.net</option>
<input name=user type=hidden><input name=pass type=hidden>//根据163的网页源文件可查找到。
。。。。
<object id="MailLogon" classid="clsid:5506F257-467D-4847-8605-8F861AFBBEEA"
codebase="MailLogon.OCX" width="100" height="40" align="absmiddle">
<param name="_Version" value="65536">
<param name="_ExtentX" value="8467">
<param name="_ExtentY" value="11924">
<param name="_StockProps" value="0">
</object>
</form>
例子:登陆163邮箱:
自己用javascript语句写一个函数:
function enter_mail(){
if(frm.flag.value=="163net")
{ frm.action="http://bjcgi.163.net/cgi/login.cgi";//163.net
if(frm.MailLogon.Logon("1"))
{
frm.user.value=frm.MailLogon.user;
frm.pass.value=frm.MailLogon.password;
}
frm.submit();
}
这种方法基本上可以应付大多数情况了。Top
19 楼xinxin()回复于 2002-05-24 17:19:36 得分 0
我还没消化完。Top
20 楼kingzai(stevenzhu)回复于 2002-05-24 17:28:43 得分 0
其实相对简单的就算第一种了,使用COM接口Top
21 楼xinxin()回复于 2002-05-25 17:13:24 得分 0
写一个ActiveX控件,把帐号和密码放到这个控件里,最后在网页中进行调用。
然后自己定制网页,把ocx给加载进去。
这句话我怎么也搞不明白。可能我得先找ActiveX方面的资料看看才能搞明白了。
我一次也没用过COM,顺便我也找资料看看再请教吧。
上面的地址看来是不通了,总进不去。Top
22 楼kingzai(stevenzhu)回复于 2002-05-25 17:42:56 得分 0
顺便说一句,以上方法都没有通用性。也就是说,登陆某个网站必须专门去编写代码。Top
23 楼xinxin()回复于 2002-05-26 15:04:14 得分 0
大体看了一下MSDN里的automation中的部分内容,英语水平太低,理解的还不理想。根据现在明白的那点感觉,kingzai提供的html语言就是activex client部分,应该从这里调用activex object。下面的语句好象是定义了一个object:
<object id="MailLogon" classid="clsid:5506F257-467D-4847-8605-8F861AFBBEEA" codebase="MailLogon.OCX" width="100" height="40" align="absmiddle">
<param name="_Version" value="65536">
<param name="_ExtentX" value="8467">
<param name="_ExtentY" value="11924">
<param name="_StockProps" value="0">
</object>
我不明白的地方是classid从哪里来?MailLogon.OCX放在什么地方?最后enter_mail()在什么时机被调用的?麻烦kingzai能大体指点一下。看来还是没有搞明白,还得再研究automation中的细节部分。
Top
24 楼wanlucky(博博)回复于 2002-05-26 15:47:39 得分 25
:对于Web页上的Edit控件的情况,如下
假设pHtmlView为指向当前Web页的视图指针
IHTMLDocument2 * pDoc = NULL;
IHTMLElementCollection * pAllElem = NULL;
IHTMLElement *pElem = NULL;
IHTMLInputTextElement * pInput = NULL;
VARIANT name;
long p;
BSTR bstrSrc;
name.vt = VT_I4;
pDoc = (IHTMLDocument2*)(pHtmlView->GetHtmlDocument());
if(pDoc!=NULL)
{
pDoc->get_all(&pAllElem);
if(pAllElem!=NULL)
{
pAllElem->get_length(&p);
if(p>0)
{
//get all input
for(int i=0; i<p; i++)
{
name.vt=VT_I4;
name.lVal = i;
if(pAllElem->item(name, name, (LPDISPATCH*)&pElem)==S_OK)
{
if(pElem != NULL)
{
pElem->QueryInterface(&pInput);
if(pInput!=NULL)
{
pInput->get_name(&bstrSrc);
CString s(bstrSrc);
SysFreeString(bstrSrc);
if (s.Compare(name)==0) //这个字符串就是网
//页上那个编辑框控件的name(也就是网页源码中的那个edit中的name),因为
//你要做的是自动注册,所以第一次你肯定先要手动注册,所以第一次可以
//用这个方法(也就是现在列出来的这段代码,只要把下面的put_value改成
//get_value,这样就得到了手动注册的内容content,以及相对应的edit控件
//的name,
pInput->put_value(content);
CString value(bstrSrc);
SysFreeString(bstrSrc);
inputs++;
pInput->Release();
pInput = NULL;
}
pElem->Release();
pElem = NULL;
}
}
}
}
pAllElem->Release();
if(inputs>0)
AfxMessageBox(IDS_SAVEDFORM);
}
pDoc->Release();
}Top
25 楼xinxin()回复于 2002-05-27 12:05:58 得分 0
将博博的程序拷下来调试一下。不过还没调试就发现程序中用了CString,CString只能在MFC里使用,而我习惯使用SDK。感觉上HtmlView似乎也要在MFC里使用。Top
26 楼xinxin()回复于 2002-05-27 12:12:35 得分 0
另外,自己写的程序中的pHtmlView怎么指向外部的注册网页的?我非常不明白。我以前用前面网友说的WindowFromPoint,可鼠标点到注册网页后就失去了控制。Top
27 楼wanlucky(博博)回复于 2002-05-28 14:35:20 得分 5
你可以
对于上面你说的情况用SetCapture()来捕获鼠标就可以了.Top
28 楼xinxin()回复于 2002-05-28 15:33:47 得分 0
想起来了,我用过SetCapture(),但动作结束后释放不了。Top
29 楼xinxin()回复于 2002-05-31 13:59:45 得分 0
虽然没有给出完整的解决方案,而我这个笨脑袋也想不出怎么能整合出一个好用的,但我现在也不急着用了。给大家辛苦分吧。Top



