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

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

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

第一個:隱藏專家瀏覽器

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

第二個:淘寶發佈大王函數

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

第三個:易創招標通學習

此次野心最大,花我精力最多,卻只賺了幾千塊,最後完全放棄。這一次給我留下了太多的經驗教訓,估計一生我也不會忘記。網站

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

 

第一篇:隱藏專家-打造一款不少人用的軟件code

從當程序員的那一天起,我就一塊兒有一個夢想,就是開發一款有不少人用的軟件,果能如此的話,這一輩子也算是有所價值,沒有白過。我第一次開發的共享軟件,隱藏專家,差點就實現了個人這個夢想。雖然一直處於自生自滅的狀態,但用戶並很多,光多特網站的下載量就達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     
相關文章
相關標籤/搜索