能力值:
( LV8,RANK:140 )
|
-
-
2 楼
你都设置完了 为什么还要调原来的... 应该是假如不设置就调原来的...
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
自己的 MySetWindowTextW 只是修改了一下szText缓冲区,真正的 显示字符串功能还要靠系统的 SetWindowTextW 来实现啊
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
我猜是汉字和数字的宽度不一样,而记事本在更新的时候局部重绘导致宽度计算错误重叠
最小化还原的时候是全刷新
嗯……完全是在瞎猜
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
宽度是一样的,都是UNICODE。我也怀疑和重绘有关,但就是确定不了,明明只改动了一下字符缓冲区而已···
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
嗯……我是说字体的数字和汉字宽度不同
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
蛋似。。为啥最小化再还原就可以显示正常了啊
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
RedrawWindow;
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
 这个应该可以解决问题~~不过可以告诉我为什么会出现这种情况么
|
能力值:
( LV11,RANK:190 )
|
-
-
10 楼
updatewindow也能解决,原因是之前已经显示的没有被清除,所以重叠了.请注意,窗口显示清除和缓冲区清除的区别
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
RedrawWindow 重画
问题出现在hook 时执行你的代码,但window 的 setwindowtext 还是会执行的
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
原版的计算器程序中应该是有清楚过期显示的操作的,而我只是添加了一个针对SetWindowTextW的Hook,其他地方都没有改动啊。为什么加了Hook之后却要自己负责清楚过期的显示了呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
因为窗口没刷新,要刷新窗口呀
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
调用约定 要用 __stdcall
BOOL WINAPI MySetWindowTextW(HWND hWnd, LPWSTR szText)
|
能力值:
( LV3,RANK:30 )
|
-
-
15 楼
BOOL MySetWindowTextW(HWND hWnd, LPCWSTR lpString)
{
if(lpString)
{
static const WCHAR Chinese[] = L"零一二三四五六七八九";
int i = 0, n = wcslen(lpString);
LPCWSTR szText = new WCHAR[n+2];
memset(szText, 0, n+2);
while(i < n)
{
if((lpString[i] <= L'9') && (lpString[i] >= L'0'))
szText[i] = Chinese[lpString[i] - L'0'];
++i;
}
BOOL bok = pfnOriginal(hWnd, szText);
delete szText;
return (bok);
}
else
{
return (pfnOriginal(hWnd, lpString));
}
}
试试这个,我机器上完全正常。那个缓冲区是只读的,最好不好随便修改
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
你程序没崩溃?
BOOL WINAPI MySetWindowTextW(HWND hWnd, LPWSTR szText)
调用约定没了,栈没平衡。另外记得自己申请内存修改然后再释放,不要在原内存修改
|
|
|