我開發共享軟件的三次經歷(上):打造一款很多人用的軟件


共享軟件這個詞,如今似乎離我們已經越來越遙遠了。還有人有用WinZip嗎?還有人記得netants嗎?這些輝煌一時的明星,已逐漸消失在人們的視野中。今天已經是免費軟件的世界。互聯網行業的巨頭們,打造的免費模式,給共享軟件敲響了喪鍾。

共享軟件,曾經寄托了多少程序員們創業致富的夢想。我也曾加入共享軟件的大潮中,用業余時間開發過差不多近十個共享軟件,最后它們大都灰飛煙滅了,但其中三次經歷,還是給我的程序員生涯留下了難以磨滅的記憶。

第一個:隱藏專家

只賺了不到一千塊。雖然一直處於自生自滅的狀態,但卻用戶數最多。05年的時候曾統計過各大網站的下載量,當時就達十幾萬的下載量,時至今日,相信用過這個軟件的人數,絕不是一個小數目。盡管差不多十年沒有更新了,仍然不時有用戶找到我要注冊碼,或者提出改進建議。曾經在《電腦報》上被刊文介紹,還被收錄到幾本雜志的光盤中。

第二個:淘寶發布大王

賺到了十萬多一點。這一次總算把握住了先機,模仿者無數。后來由於環境變化,軟件失去了價值,自然消失。雖然賺的錢不算多,但卻在一定程度上改變了我的生活,因為靠着這十萬元,在這個寸土寸金的大城市里,我終於有了一塊自己的立足之地。

第三個:易創招標通

這次野心最大,花我精力最多,卻只賺了幾千塊,最后徹底放棄。這一次給我留下了太多的經驗教訓,估計一輩子我也不會忘記。

      本人拙作《程序員第二步-從程序員到項目經理》已經由人民郵電出版社出版,當當網京東網均可預訂,謝謝各位園友們的長期大力支持!

 

第一篇:隱藏專家-打造一款很多人用的軟件

從當程序員的那一天起,我就一起有一個夢想,就是開發一款有很多人用的軟件,果能如此的話,這一生也算是有所價值,沒有白過。我第一次開發的共享軟件,隱藏專家,差點就實現了我的這個夢想。雖然一直處於自生自滅的狀態,但用戶並不少,光多特網站的下載量就達5萬多,相信用過這款軟件的人,總該有幾十萬吧。盡管差不多十年沒有更新了,仍然不時有用戶找到我要注冊碼,或者提出改進建議。曾經在《電腦報》上被刊文介紹,還被收錄到幾本雜志的光盤中。

隱藏專家是一個很簡單的軟件,它的功能可以用一句話說清楚:按下快捷鍵,立即隱藏指定的窗口和托盤圖標。開發這個軟件,最開始是給自己用的,當看到領導朝這邊走來時,我輕輕按下Alt+X,QQ窗口、IE瀏覽器,連接QQ托盤圖標全部都會消失的得無影無蹤。

隱藏專家是2002年用Delphi開發的。寫這個軟件,還有一個目的,就是學習。我當時對於寫程序還是初入門,對於程序代碼是怎樣工作的,還一點也不懂。通過開發隱藏專家,我對Windows消息機制,終於有了比較清楚的認識,同時也學會了不少Windows API的用法。

這里要感謝一下“大富翁論壇”,這是一個當年非常火爆的Delphi技術論壇,從上面我下載了一個近300M的離線資料,至今還保存在我的移動硬盤上。我幾乎把每一篇都看過,實在是受益匪淺,可以說,大富翁論壇就是我的啟蒙老師。

  

下面介紹一下這個小軟件所用的到一些關鍵技術:

1.窗口隱藏:

要隱藏窗口,首先要找到窗口,就是遍歷所有的窗口(FinWindow, GetWindow兩個API),然后看窗口標題文字是否符合設定的條件,如果符合,就隱藏或顯示該窗口(ShowWindow),這些都是通過Windows API來實現的。

主要代碼如下所示:

//顯示或隱藏標題在winlist中的所有窗口。
procedure HideWindow(WinList:TStringList);
var
  hCurWindow:HWND;
  WinText:Array[ 0.. 255of char;
  i:integer;
begin
   if winList =  nil  then exit;
    hCurWindow:=GetWindow(FindWindow( ' Shell_TrayWnd ', nil),GW_HWNDFirst);
  While hCurWindow<> 0  do
   begin
      if GetWindowText(hCurWindow,@WinText, 255)> 0  then
      begin
         for i:= 0  to winlist.Count- 1  do
         begin
            if pos(lowercase(winlist.Strings[i]),lowercase(StrPas(@Wintext)))> 0  then
            begin
              if IsShow  then
                begin
                 //隱藏窗口
                 ShowWindow(GetWindow(hCurWindow,GW_OWNER),SW_HIDE);
                 ShowWindow(hCurWindow,SW_HIDE);
                end
              else
                begin
                 ShowWindow(GetWindow(hCurWindow,GW_OWNER),SW_SHOW);
                 ShowWindow(hCurWindow,SW_SHOW);
                end;
            end;
         end;
      end;
     hCurWindow:=GetWindow(hCurWindow,GW_HWNDNEXT);
   end;
end;

2.托盤圖標隱藏

這個功能網上基本上沒什么資料,費了我不少時間。經過長時間的琢磨,終於找到了解決之道。我用spy++觀察托盤區,發現圖標都在一個類名為ToolbarWindow32的工具條窗口中,既然如此,應該可以有相應的方法,讀出工具條某個按鈕的文字信息,以及通過發送消息將其顯示或隱藏。順滕模瓜,最后終於找到了解決方法:

 

//取得托盤區圖標列表所在的窗口句柄,是一個toolbarwindow32類的工具條
function GetTrayHandle():THandle;   
var
 wnd,wnd2:HWND;
begin
  wnd := FindWindow( ' Shell_TrayWnd ', nil);
  wnd2 := FindWindowEx(wnd, 0, ' TrayNotifyWnd ', nil);
  wnd := FindWindowEx(wnd2, 0, ' ToolbarWindow32 ', nil);
   if wnd= 0  then
   begin
    wnd := FindWindowEx(wnd2, 0, ' TrayClockWClass ', nil);
    wnd := GetNextWindow(wnd,GW_HWNDNEXT);
    wnd := FindWindowEx(wnd, 0, ' ToolbarWindow32 ', nil);
    result := wnd;
   end
   else
    result := wnd;
end;

//隱藏托盤圖標的函數
procedure HideIcon(strHint:string;bHide:boolean);
var
 nItemCount,i:integer;
 chBuffer: array[ 0.. 255of char;
 dwProcessID:DWORD;
 hProcess:Cardinal;
 adPointer:Pointer;
 nNumberOfBytesRead:Cardinal;
 bi:TTBBUTTON;
 hWindow:THandle;
 str1,str2:string;
begin
  str1 := lowercase(strHint);
  hWindow := GetTrayHandle;
  nItemCount := SendMessage(hWindow, TB_BUTTONCOUNT,  00);
  GetWindowThreadProcessId(hWindow, @dwProcessID);
  hProcess := OpenProcess(PROCESS_VM_OPERATION + PROCESS_VM_READ + PROCESS_VM_WRITE,
                    false,
                    dwProcessID);
  adPointer := VirtualAllocEx(hProcess,
                             nil,
                             4096,
                            MEM_RESERVE + MEM_COMMIT,
                            PAGE_READWRITE);
    try
       for i:= 0  to nItemCount  do
       begin
           //獲取工具條按鈕的提示文字信息
         SendMessage(hWindow, TB_GETBUTTON, i, integer(adPointer));
         ReadProcessMemory(hProcess,
                          (adPointer),
                          @bi,
                          sizeof(bi),
                          nNumberOfBytesRead);
         SendMessage(hWindow, TB_GETBUTTONTEXT , bi.idCommand, integer(adPointer));
         ReadProcessMemory(hProcess,
                      adPointer,
                      @chBuffer,
                      sizeof(chBuffer),
                      nNumberOfBytesRead);

        //比對文字,判斷是否為要隱藏的圖標
        str2:= lowercase(chBuffer);
         if pos(str1,str2)> 0  then
         begin
           if bHide  then
            sendmessage(hWindow,TB_HIDEBUTTON,bi.idCommand,makelong( 1, 0))
           else
            sendmessage(hWindow,TB_HIDEBUTTON,bi.idCommand,makelong( 0, 0));
          exit;
         end;
       end
    finally
       VirtualFreeEx(hProcess,
                    adPointer,
                     0,
                    MEM_RELEASE);
      CloseHandle(hProcess);
     end;
end;

3.全局熱鍵注冊

隱藏窗口的快捷鍵必須在任何情況下都可以使用,主要用到一個API函數:RegisterHotKey,如果取消注冊,則調用UnRegisterHotKey。

軟件還有一個屏蔽用戶鍵盤和鼠標輸入的功能,當屏蔽時,用戶不能進行任何鍵盤和鼠標的操作,就像死機了一樣,這個功能需要另一個API函數來實現,就是SetWindowsHookEx,這個函數可以設置一個全局鈎子,“鈎住”鍵盤消息和鼠標消息,自己進行處理。如果要取消鈎子,則調用unhookWindowsHookEx函數來實現。

 

隱藏專家這個軟件,總共收了不到1000元注冊費,其中還有幾百塊是在天空軟件站的賬戶,由於我長期沒有去維護,后來竟然發現被賬戶被注銷了,至於這幾百塊錢,也不知所蹤。更讓人生氣的是,隱藏專家在天空軟件站上也不翼而飛,再也找不到了。隱藏專家從定位來說,應該說還是抓住了不少用戶的心理,具有不錯的實用性。之所以沒有成功,我將原因歸結為三點:一是包裝不夠;二是缺乏營銷;三是國內共享軟件的生存環境不佳。

這一次經歷,讓我明白了做共享軟件賺錢並不容易,特別針對國內市場。后來我看到一篇文章,講一個程序員做了一個mp3轉CD的軟件,在國外市場一個月可以收到5萬美金的注冊費,原來小軟件確實是可以賺大錢的。我動了心,可惜由於功力未夠,一直未能將其推廣到國外,總歸是一件遺憾的事情。

不過到今天,我想是該發布一個永久免費版了,既然賺不到錢,何不免費讓更多人來用,這不也能有助於達成我很久以前的心願——開發一款很多人用的軟件嗎?只要有人還要用它,也許也算是一種成功吧。

  ---------------------------------

        本人拙作《程序員第二步--從程序員到項目經理》已經由人民郵電出版社出版,謝謝各位園友的長期支持!

        當當網:http://product.dangdang.com/23365823.html 

        京東網:http://item.jd.com/11350488.html     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM