屏幕取词问题?桌面上的图标示中文标题的没问题,遇到标题是英文的就回去处乱码?请教?(200分)

  • 主题发起人 主题发起人 qghwei
  • 开始时间 开始时间
Q

qghwei

Unregistered / Unconfirmed
GUEST, unregistred user!
我借鉴一些屏幕取词的代码,整理后取桌面上的中文标题没有问题,如果桌面的图标为英文的,屏幕取词取出的结果就为乱码,在论坛上也看了很多,经过测试都出现同样的问题。不知有没有遇到相同问题的,如何解决的?谢谢!
 
没有人遇到这样的问题吗?为什么我从网上查找的所有屏幕取词的资料在我的机器上都出现乱码的问题,在别的机器上有可能不出现。而金山的都不会出现乱码?有什么地方需要特殊处理的吗?请赐教!
 
Hi 怎么了?怎么没有人理呀,分不是问题,给点意见也行,这几天该试也都试了,就是没有找到好的解决方法。希望大家多多提提见解,谢谢!
 
兄弟伙把你的那段代码我看一下呢
 
会不会是unicode搞的鬼?
 
首先感谢两位的采参与。这是其中TextOutW实现的过程和需要的函数,请提宝贵意见,谢谢!<br>//初识化APIHOOK<br>HookNT[fTextOutW]:= TuhAPIHook32.Create(Trap, @TextOutW,NewTextOutW);<br>//对截获API函数的初始化<br>{HOOK的入口,其中IsTrap表示是否采用陷阱式}<br>constructor TuhAPIHook32.Create(IsTrap: Boolean; OldFun, NewFun: Pointer);<br>begin<br> &nbsp; {求被截函数、自定义函数的实际地址}<br> &nbsp; OldFunction := FinalFunctionAddress(OldFun);<br> &nbsp; NewFunction := FinalFunctionAddress(NewFun);<br> &nbsp; Trap := IsTrap;<br> &nbsp; if Trap then{如果是陷阱式}<br> &nbsp; begin<br> &nbsp; &nbsp; &nbsp;{以特权的方式来打开当前进程}<br> &nbsp; &nbsp; &nbsp;hProcess := OpenProcess(PROCESS_ALL_ACCESS,FALSE, GetCurrentProcessID);<br> &nbsp; &nbsp; &nbsp;{生成jmp xxxx的代码,共5字节}<br> &nbsp; &nbsp; &nbsp;Newcode.JmpCode := ShortInt($E9); {jmp指令的十六进制代码是E9}<br> &nbsp; &nbsp; &nbsp;NewCode.FuncAddr := DWORD(NewFunction) - DWORD(OldFunction) - 5;<br> &nbsp; &nbsp; &nbsp;{保存被截函数的前5个字节}<br> &nbsp; &nbsp; &nbsp;move(OldFunction^,OldCode,5); &nbsp; &nbsp; &nbsp;<br> &nbsp; &nbsp; &nbsp;{设置为还没有开始HOOK}<br> &nbsp; &nbsp; &nbsp;AlreadyHook:=false;<br> &nbsp; end<br> &nbsp; else<br> &nbsp; &nbsp; AllowChange := True; //如果是改引入表式,将允许HOOK<br> &nbsp; Change; {开始HOOK} &nbsp; <br> &nbsp; {如果是改引入表式,将暂时不允许HOOK}<br> &nbsp; if not Trap then AllowChange := False;<br>end;<br>//TextOutW 函数<br>function NewTextOutW(theDC: HDC; nXStart, nYStart: integer; str: pWidechar; count: integer): bool; stdcall;<br>begin<br> &nbsp;HookNT[fTextOutW].Restore();{暂停截取API,恢复被截的函数}<br> &nbsp;//修改字体和字符集,有时能用,<br> &nbsp;//if (pShMem^.bCanSpyNT) then CreateRangFont(theDC) else RestoreRangFont;<br><br> &nbsp;FilterTextW(theDC, nXStart, nYStart, Str, Count);<br>{$ifdef debug}<br> &nbsp;SetTextColor(thedc,clTextOutW);<br>{$endif}<br> &nbsp;Result := TTextOutW(HookNT[fTextOutW].OldFunction)(theDC, nXStart, nYStart, str, Count);<br><br> &nbsp;HookNT[fTextOutW].Change();{重新截取API}<br>end;<br><br>//FilterTextW 函数<br>procedure FilterTextW(theDC: HDC; nXStart, nYStart: Integer; Str: PWideChar; Count: Integer);<br>var<br> &nbsp;r: TRect;<br> &nbsp;ws: WideString;<br>begin<br> &nbsp;if not pShMem^.bCanSpyNT then Exit;<br> &nbsp;r := GetTextRectW(theDC, nXStart, nYStart, Str, Count);<br> &nbsp;if PtInRect(r, pShMem^.OldPt) then<br> &nbsp;begin<br> &nbsp; &nbsp;ws := GetRealStrW(theDC, Str, Count, pShMem^.pMouse, r.Left);<br> &nbsp; &nbsp;//向上层发送消息<br> &nbsp; &nbsp;SaveToBuffer(ws);<br> &nbsp;end;<br>end;
 
我以前写了一个屏幕取词工具,中英文都能正常,没有乱码。也是参考网上的相关资料。
 
to szlbz:<br> &nbsp; 你是在 WINDOWS 2000 下用的没有乱码吗?经过我的测试 2000 下有的出现,有的不出现,找不到规律,XP和2003不会出现乱码?有什么特殊需要注意的地方吗?谢谢!
 
能不能和金山词霸兼容?<br>会不会有冲突饿。
 
to qghwei:<br> &nbsp;在xp和2003不会有乱码,2000上无测试。
 
to szlbz:<br> &nbsp;谢谢您的关注,我也测试过了,在XP和2003下没有问题,在2000下有的机器会出现乱码问题,不知道是什么原因。
 
后退
顶部