实现多实例(多开)的5种方法 - C# Wince/WM 开发

来源:互联网 发布:twilight软件 编辑:程序博客网 时间:2024/04/30 08:39

       最近为这个多开费了不少精力,失败后再失败,发现后再发现,最后答案居然近在眼前,我把我的经历和结果写下来,与需要的人分享.

       突然发现网络上的txt阅读器,没一个我满意的,故想要自己做一个,文件实现关联后,接踵而来的就是多开的问题,没想到这一步走得如此艰辛.

我初出茅庐的第一种方法(失败):

       用反汇编工具对生成后的.exe进行修改,灵感来自口袋数码坛论里的一篇帖子:http://bbs.pdafans.com/viewthread.php?tid=637261&highlight=%B6%E0%2B%D4%CB%D0%D0

       bryan用的是叫IDA(Interactive DisAssembler)的反汇编工具,下载地址:http://www.cr173.com/soft/14313.html

       下载后能打开C#编译的执行文件,打开后就无语了,并没有CreateMutexW函数啊也找不到Findwindows等函数,就几个我写的函数其他都是汇编或是我看不懂的语言,虽然学过点汇编但没坚持学下去,好了现在要用的时候就看不懂了,软件操作也不太适应,要花点时间专门学习一下才会使用,而且就算修改了要保存成.exe也挺麻烦,故就此作罢,宣布放弃,一次失败.

灵感乍现,傻瓜式的第二种方法(成功):

        用个辅助程序来帮助启动主程序,辅助程序的作用就是修改主程序的名字后再启动主程序并把关联文件的路径作为参数传给主程序,主程序运行后再把程序名改回来,因为windows是通过查找主程序名(包括路径)来决定是激活还是启动.而且在WM上不像PC,(一般情况)程序运行后可以任意修改程序路径,甚至把程序删了也没问题,所以这次成功了,Y,但这样修改随之而来的问题就是程序问题:启动慢,不稳定,不方便.我还想尝试寻找更好的方法,故继续探索.

最艰辛的第三种方法(失败):

       发现第二种方法的缺点后,第一个想到的就是,有什么办法可以把辅助程序去掉,因为做过捕获屏幕旋转的消息,故想是否用fexplore或Resco Explorer打开关联文件时,程序会收到包含文件路径的消息,如果捕获这个消息时修改程序名再启动程序同样可以达到多开的效果,故为了这个在网上问啊问,找啊找,可能是自己C#语言还学不到位,都以失败告终

      曾尝试过以下途径找寻找方法:

      CSdn帖:http://topic.csdn.net/u/20110118/21/aacb6f7d-54a9-4c6a-89b3-86b41acb6e03.html?221881

                    http://topic.csdn.net/u/20110124/10/5312c216-0591-40cd-be99-9e060972cad3.html?27325

                    http://topic.csdn.net/u/20110126/12/9b373388-40da-4820-b1b5-befa67c6921d.html

        MSdn帖: http://social.msdn.microsoft.com/Forums/zh-TW/803/thread/94b9aa5f-91a3-4262-8409-22117fcdd8b2

      开始一直在找如何捕获WM_COPYDATA消息的方法后来用远程监视发现根本没有WM_COPYDATA消息,也找不到其它可能的消息

     远程监视图:

      更到猪八戒威客那里求法:http://task.zhubajie.com/572410/(都说加Q,哇靠,加到现在还没回应)

第四种方法(失败):

       http://topic.csdn.net/u/20101107/23/7e50ede4-7fa1-4e89-bfb5-4d7748a8add7.html( WM下的程序只能运行一个实例。后续打开的时候,运行中的程序怎么能感知到?)是我找到的第一个有关这方面的内容的帖子,根据dfererer提供的方法,用SetWindowText修改窗口名,改是改了,但还是无法实现多开,可能是因为他们使用的不是C#,但我相信通过修改进程的某个属性还是有可能多开的,但可能性太小,研究难度太大,故放弃

远在天边,近在眼前的第五种方法(最终方法,成功):

       最开始有想过,但觉得不可能就没去尝试,在我山穷水尽之时突然想起它,没想到居然尝试成功了,汗

       该方法就是在Program.cs文档中在代码"Application.Run(new Form1());"之前修改程序名,然后在Form1.cs里找个地方再把程序名改回来,Program.cs的代码如下:

  

   改方法虽然到目前为止一切正常,但以后程序复杂了,也可能产生问题,到那时再继续研究方法34,或继续找别的方法.

其它方法:

        1.用C++来开发选择Win32设备智能项目,打开源文件里的"name.cpp"文件,注释掉一下代码就可以完美的实现多开了.

    //如果它已经在运行,则将焦点置于窗口上,然后退出
    hWnd = FindWindow(szWindowClass, szTitle); 
    if (hWnd)
    {
        // 将焦点置于最前面的子窗口
        // “| 0x00000001”用于将所有附属窗口置于前台并
        // 激活这些窗口。
        SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
        return 0;
    }

原创粉丝点击