Linux中Wine QQ问题的解决

因为周围朋友同事都使用QQ,联络上离不开QQ。WebQQ的聊天记录和文件传送功能有限,LinuxQQ经常显示备注出错,并且文件传送功能也很有限,无奈选用非常占资源的wine QQ, 最重要的就win版QQ传送文件文件功能很好用,且可以远程协助他人。.

关于怎么在wine中安装QQ,网上教程很多,不过能搜索到的不少都有点老了,以前用Debian5.0/6.0的时候就是按网上教程并自己实践的。用wine1.2系列安装QQ是非常折腾的,需要安装很多支撑库,而且容易崩溃。在wine1.3版本后,就相对容易许多了。

以现在Ubuntu11.10为例,使用的是wine1.3.28版本,安装QQ2010的步骤:
1、sudo apt-get  install cups-bsd gnome-exe-thumbnailer wine1.3 ttf-droid ttf-liberation ttf-unfonts-core wine1.3-gecko winetricks

2、winetricks ie6 vcrun6 riched20

3、wine QQ2010.exe

(更新:如果需要安装QQ2011,则需要使用ppa上面的wine1.3.35版本之后的wine,但本人未测试过。)

QQ(2010)在wine里面的两个问题:

1、“在线”状态时候很快自动切换到”离开“状态,不论“状态切换”的设置如何。
    2、使用gnome的“显示桌面”功能后,QQ主界面无法显示出来。

问题分析及解决:

1、状态切换问题:

根据状态切换原理,首先想到的是GetLastInputInfo这个函数,写了个测试程序,发现这个函数在wine里面运行是正常的。不过在gnome-terminal下启动wine /path_to_qq/qq.exe,发现重复如下信息:

fixme:crypt:SystemFunction041 (0x3d0b728, e78, 1): stub [RtlDecryptMemory]

fixme:crypt:SystemFunction040 (0x5558fc8, e78, 1): stub [RtlEncryptMemory]

fixme:winstation:OpenInputDesktop (0,0,400001cf): stub

    这个 OpenInputDesktop很可疑,google之发现其常用作检测当前桌面是否处于可输入状态,如果不能输入,通常是桌面被锁或者处理用户切换状态。在QQ的Bin目录下面翻箱倒柜的找了一遍,发现是Common.dll引用了这个函数。下面要有请逆向神器IDA出场~为了表示对IDA的景仰之情,要先沐浴更衣,并斋戒九日,1,2,...,9好,时辰到,启动IDA,打开common.dll,泡茶稍等,查找OpenInputDesktop,看到那个粉红色的OpenInputDesktop了吗?是的,是OpenInputDesktop(激动ing...),它在Util::WinScreenStatus::IsComputerLocked()这个函数里面,看这个函数名字就可以猜测出来它是判断系统是否处于锁屏的状态,返回值应该是int(甚至是bool型),从下图的IDA逆向代码来看,如果OpenInputDesktop失败,则函数提前结束,返回0。

解决办法:

使得这个函数返回true就可以解决问题了。本人采用把OpenInputDesktop之后的那个jnz换成jmp的方法来完成的。使用IDA的HexView,找到jnz对应的机器代码75 xx,把随后的十来个数字一起,作为特征码;用WinHex打开common.dll,使用上面“特征码“定位,并把75改成EB(即jnz->jmp),并把common.dll的头部checksum值清空,保存文件。再次启qq,状态切换问题解决。(缺点是:在Linux真的处于锁屏状态时,QQ仍显示在线。

2、主界面不显示问题:

在Debian下,Ctrl+Alt+d(显示桌面)后,双击托盘的qq图标,qq主界面不显示。本人解决办法是使用ShowWindow,代码如下:

[cpp] view plain copy
  1. // showQQ.cpp : Defines the entry point for the application.
  2. #include <windows.h>
  3. BOOL CALLBACK EnumWndProc(HWND hWnd,LPARAM lParam)
  4. {
  5. TCHAR winTitle[MAX_PATH] = {0};
  6. ::GetWindowText(hWnd, winTitle, sizeof(winTitle));
  7. if( 0 == strcmp(winTitle, "QQ International")
  8. || 0 == strcmp(winTitle, "QQ2011")
  9. || 0 == strcmp(winTitle, "QQ2010")
  10. // 请自行添加其它需要的QQ主窗口名
  11. )
  12. {
  13. ::SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
  14. ::ShowWindow(hWnd, SW_SHOWNORMAL);
  15. ::SendMessage(hWnd, WM_SHOWWINDOW, 1, 0);
  16. }
  17. return TRUE;
  18. }
  19. int APIENTRY WinMain(HINSTANCE hInstance,
  20. HINSTANCE hPrevInstance,
  21. LPSTR     lpCmdLine,
  22. int       nCmdShow)
  23. {
  24. ::EnumWindows(EnumWndProc, (LPARAM)0);
  25. return 0;
  26. }

用vc6编译后备用,当qq不出现的时候,用wine运行这个showQQ.exe程序就可以了。

结语:

qq是身边人用得比较多的联系工具,但腾讯对Linux用户照顾不周,使用非常艰难。希望有更好的开放协议的通讯工具,让大家有更多的选择。

附:

测试 GetLastInputInfo代码

[cpp] view plain copy
  1. #define _WIN32_WINNT 0x500
  2. #include <windows.h>
  3. #include <winuser.h>
  4. #include "stdio.h"
  5. #include "time.h"
  6. int main(int argc, char* argv[])
  7. {
  8. LASTINPUTINFO info;
  9. info.cbSize = sizeof(info);
  10. while(1) {
  11. if(GetLastInputInfo(&info)) {
  12. printf ( "%ud\n", info.dwTime);
  13. }
  14. else {
  15. printf("get last input info fail.\n");
  16. }
  17. Sleep(1000);
  18. }
  19. return 0;
  20. }

Linux中Wine QQ上线 转变成离线问题的解决(什么时候才能自己修改?)(qq2012出了 那个没有这个BUG)相关推荐

  1. 在 Linux 中把一个网页转换成 PDF的技巧介绍

    你如何在 Linux 中把一个网页转换成 PDF?你可以选择使用每个 Linux 发行版上的网页浏览器(GUI),或者使用终端将网页变成 PDF 文件. 在这里,我将提到这两种方法来帮助你完成工作. ...

  2. linux中wine yum安装,分享|在基于RedHat或Debian的系统上安装 Wine 1.7

    Wine,Linux上最流行也是最有力的软件, 可以顺利地在Linux平台上运行Windows程序和游戏. 这篇文章教你怎么在像CentOS, Fedora, Ubuntu, Linux Mint一样 ...

  3. qq怎么看linux教程,WINE QQ 2009教程 看很多人还为QQ着急

    WINE QQ 2009教程 看很多人还为QQ着急 发布时间:2010-01-07 21:21:06来源:红联作者:augustd2 一.安装好 Wine 1.2(1.2 版安装好就支持中文界面的了) ...

  4. 关于Ubuntu16.04 中wine QQ 国际版无法输入中文

    自己刚入手Ubuntu 安装QQ后发现无法使用输入法,在网上找了好久,才了适当的方法,希望能帮助更多的人. 1.下载安装 wine QQ 2012 国际版 2.登陆QQ 3.在控制台输入 sudo g ...

  5. openrowset excel 科学计数_txt的数据导入excel中身份证或银行卡显示成科学计数如何解决...

    用excel自带的"数据"->"自文本"将txt的数据导入excel中,如果数字特别长比如身份证或者银行卡会显示成科学计数法,如下: 借助sqlcel我们 ...

  6. linux中 tar 报参数列表过长,四种解决”Argument list too long”参数列表过长的办法...

    在linux中删除大量文件时,直接用rm会出现:-bash: /bin/rm: 参数列表过长,的错误. 这时可以用find命令来结合使用. 例: 1.rm * -rf 改为: find . -name ...

  7. txt的数据导入excel中身份证或银行卡显示成科学计数如何解决

    用excel自带的"数据"->"自文本"将txt的数据导入excel中,如果数字特别长比如身份证或者银行卡会显示成科学计数法,如下: 借助sqlcel我们 ...

  8. Linux中如何将文件dump成16进制值

    http://www.cnblogs.com/bcxx_qin/archive/2009/05/06/1450596.html 在linux中有多种方式可以将文件dump成16进制显示,也可以将16进 ...

  9. linux中wine文件夹在哪,科学网—Linux下wine的安装和使用以及CAJviewer的安装 - 苗玉虎的博文...

    最近突然想使用caj软件看文献,发现linux不支持,so百度一下如何安装,搜到好多,但很多都很乱,遂记下自己的心路历程,以示记载,或许时间久了忘记,留个备份吧,也希望对他人有帮助. 下载好CAJvi ...

最新文章

  1. C#之Action和Func的用法
  2. footer始终在页面最底部的方法(问题待检验)
  3. C++ XML解析之TinyXML篇
  4. vue.js框架原理浅析 1
  5. “数据门”事件频发 如何避免人为因素导致数据泄露?
  6. 计算机辅助应用的缩写有什么,计算机辅助设计的英文缩写是什么
  7. #C语言#警告:隐式声明函数‘xxx’ [-Wimplicit-function-declaration]
  8. python从入门到精通需要多久-Python从入门到精通:一个月就够了
  9. pygame 文字输入交互_如何在pygame中创建交互式对象?
  10. 4.微服务设计 --- 集成
  11. 计算机应用基础实验报告册,大学计算机应用基础实验报告册 - 2010版 - (1)
  12. 【毕业设计】基于SSM图书信息管理系统
  13. Cadence Allegro PCB设计88问解析(十二) 之 Allegro中两种单位显示设置
  14. python破解excel进入密码(指定密码字符)
  15. html 查找页面内容,如何在html页面中实现查找功能
  16. Spring Boot 支持 HTTPS 如此简单,So easy!
  17. 深入浅出计算机组成原理(二)——给你一张知识地图,计算机组成原理应
  18. 电子计算机技发展趋势,现代电子信息技的现况及发展趋势.ppt
  19. SCI从入门到精通(第一版)
  20. opencv 图片上画一条线

热门文章

  1. 【Genshin私服】Grasscutter部署全流程
  2. nodejs生成网页快照base64图片
  3. eu指什么_EU是什么意思_EU怎么读_EU翻译_用法_发音_词组_同反义词_European Union 欧盟-新东方在线英语词典...
  4. MVC框架实现用户登录注册功能(连接数据库)
  5. win10恶意软件删除工具
  6. Kafka终极面试题
  7. DSL element ‘useProguard‘ is obsolete and will be removed soon. Use ‘android.enableR8‘ in gradle.pro
  8. 解决mac启动vue项目报错
  9. scala基础(一)
  10. (笔记)ubuntu20.04下 yolov5学习与使用