高难问题请教,500分!(100分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
我看你还是直接修改comctl32.dll得了。
 
知道怎么重载comctl32.dll,嘿嘿嘿
 
这个问题已基本解决,用我自己的那个方法 --- 嘿嘿,笨人自有笨办法!<br><br>不过目前还有几个残余问题没解决,以至于处理过程中需要人工参与,不爽:<br><br>1.首先,因为我是用程序把整个文本变成一行,那么我要先知道文本总共有<br>&nbsp; 多少行,然后根据行数循环发送按键消息就可以了,但是这个文本框屏蔽<br>&nbsp; 了EM_GETLINECOUNT这个消息,无法得到总行数,所以我现在必须每次<br>&nbsp; &nbsp;先手工输入行数. 所以我需要一个用程序得到行数的办法.<br><br>&nbsp; 可能的方法是:<br>&nbsp; 和很多编辑器类似,这个程序的窗口下方有一个状态条,而且是windows<br>&nbsp; 的标准状态条,上面随时显示当前插字符的row:col,所以我应该可以<br>&nbsp; 先用代码将插字符送到文本最后,然后读取状态条上的文本----这时显示的<br>&nbsp; 应该是最大的行数:总行数.<br>&nbsp; 但是,我用spy++一看,整个状态条是一个窗口,无法得到上面某一个panel<br>&nbsp; 的内容,有什么办法解决? <br>&nbsp; 提示:参考delphi源程序里面如何得到statusbar的panel的文本.<br><br>2.当我把整个文本变成一行之后,然后模拟按键ctrl+f,这样调出了find<br>&nbsp; 对话框,我想用代码给对话框发送wm_copy或类似的消息,好拷贝对话框<br>&nbsp; 里面的那个"搜索关键字"文本框中的内容,但是没有成功,似乎dialog<br>&nbsp; 的消息机制和普通窗口不一样,于是我现在必须手动按一下ctrl+insert,<br>&nbsp; 拷贝进剪贴版,然后让我的程序继续处理(处理剪贴版) . 所以我希望<br>&nbsp; 能通过程序给dialog发送消息.<br>&nbsp; 我试过keybd_event,sendmessage好像都没用,用spy++监视对话框消息,<br>&nbsp; 发现了一些和普通窗口不一样的消息,似乎是什么WM_GETDLGCODE等,看来<br>&nbsp; 确实和普通窗口不一样.<br>&nbsp; 大家如果要尝试一下,可以自己打开一个应用程序的标准find对话框,然后<br>&nbsp; 尝试给他发送消息.<br><br>如果上面2个问题能够解决,我的程序就基本上可以做到自动化处理了.<br>解决问题者有分,分不够我再加,反正分有的是!<br>
 
给statusbar发sb_gettext消息可获得text<br>SB_GETTEXT<br><br><br>SB_GETTEXT <br>&nbsp; &nbsp; wParam = (WPARAM) iPart; <br>&nbsp; &nbsp; lParam = (LPARAM) (LPSTR) szText; <br><br>Retrieves the text from the specified part of a status window. <br><br>Returns a 32-bit value that consists of two 16-bit values. The low word specifies the length, in characters, of the text. The high word specifies the type of operation used to draw the text. The type can be one of the following values: 0 &nbsp;The text is drawn with a border to appear lower than the plane of the window. <br>SBT_NOBORDERS &nbsp;The text is drawn without borders. <br>SBT_POPOUT &nbsp;The text is drawn with a border to appear higher than the plane of the window. <br>SBT_RTLREADING &nbsp;Displays text using right-to-left reading order on Hebrew or Arabic systems. <br><br>iPart <br>Zero-based index of the part from which to retrieve text. <br>szText <br>Address of the buffer that receives the text. This parameter is a null-terminated string. <br>If the text has the SBT_OWNERDRAW drawing type, this message returns the 32-bit value associated with the text instead of the length and operation type. <br><br><br>--------------------------------------------------------------------------------<br>
 
谢! 晚上试验.<br><br>关于给find对话框发消息有没有解决办法?
 
呵呵,caKK的“古怪想法”就是不少。。<br><br>跟 :)
 
hubdog: SB_GETTEXT不行. :-(<br><br>按理说应该是可以的,MSDN上是这么说的,而且用SB_GETTEXTLENGTH可以得到<br>正确的文字长度,但是SB_GETTEXT返回的是乱码... :-(<br><br>我记得前几天有人问过,说读取别的软件里面的ListView的item的值,得到的<br>也是乱码,看来comctrl.dll里面的东西还有些名堂啊!<br><br>另外,不试不知道,我才发现,原来delphi里面的status bar是自己实现的,不是<br>用的windows标准状态条,可笑我还建议大家参考delphi的源码... :-P<br><br>如果实在不行,就争取搞定给find对话框发消息的问题,这个问题解决,能实现<br>很大程度上的自动化处理.....我今天又半自动化的"处理"了100多个文件,<br>累死了,可是还有好几百个哪! 如果能自动化就好了....
 
一定有一个变量存放了那些文字的指针。找到这个变量就成了嘛,<br>在程序里把指针指向他,应该是可以的。<br>而且对于一个程序一般来说这个变量应该有一个固定的偏移量。<br>所以象fpe做应该是可以的。
 
&gt;&gt;在程序里把指针指向他<br>在delphi里面怎样做?
 
pchar(pointer(XXXX)^);
 
&gt;&gt;pchar(pointer(XXXX)^);<br>有点意思,那么XXXX的值我如何得到呢?
 
网上不是有屏幕抓字教程吗?想来可以满足你的需要。
 
品雪兄: 我现在要自动处理呀! 如果我有闲工夫去屏幕抓字,还不如把自己眼睛看到的<br>&nbsp; &nbsp; &nbsp; &nbsp; 写下来填上呢.
 
自己做个内存查找程序,找到制定的字符串,然后.........<br>不就搞定拉!:)
 
我总觉得应该没这么麻烦, 用SB_GETTEXT应该就可以搞定,肯定是哪里没设置好.
 
不管怎么说,我觉得Energy的<br>pchar(pointer(XXXX)^);<br><br>很有意思,我是不是可以用pTform(pointer(XXXX)^);把一个外部窗口当作自己<br>的一个form来用呢?
 
各位大虾慢慢的仔细的谈,请注意我想再拿出100分做为奖励.
 
对不起各位,我是第一次来这的,我的意见和大家不太一样,我认为此问题根本无解,原因是:<br>1、由于窗口的类名不是Windows的标准类名,如:BUTTON,EDIT之类,窗口的实现可以是任何形式的,举一个简单的例子:可以使一个Form或者ScrollBox具有“编辑”的功能,这里的编辑的功能其实只是实现了Caret,和定点移动而已,在“Programming Windows”(好像是这本书吧)有一个实现Notepad的例子,大家可以参考。如果让你实现一个HTML编辑器(或类似的东西)的话,你会从Edit中派生还是自己实现Edit的逻辑呢?我认为实现Edit的逻辑并不难。<br>2、如果使用钩子的话,只能实现消息的拦截,试问如果我在程序中在响应 WM_RMOUSEDOWN(举个例子)的消息的时候用DrawText写了一段文本,如何拦截些的是什么文本?<br>3、在内存中的文本组织可能并不是平面的,如你想做一些读入XML文件的程序,树状组织可能更好,即便是一个简单的链表结构,可能也不好用一个简单的<br>PChar(Pointer(XXXX))获得吧!<br><br>以上只是一些简单的初步认识,可以email我讨论这个问题:super11@email.com.cn
 
谢谢大家,我已经用我说的那个笨办法解决了,效果很好.习习.
 
后退
顶部