共享軟件這個詞,如今似乎離我們已經越來越遙遠了。還有人有用WinZip嗎?還有人記得netants嗎?這些輝煌一時的明星,已逐漸消失在人們的視野中。今天已經是免費軟件的世界。互聯網行業的巨頭們,打造的免費模式,給共享軟件敲響了喪鍾。
共享軟件,曾經寄托了多少程序員們創業致富的夢想。我也曾加入共享軟件的大潮中,用業余時間開發過差不多近十個共享軟件,最后它們大都灰飛煙滅了,但其中三次經歷,還是給我的程序員生涯留下了難以磨滅的記憶。
第一個:隱藏專家
只賺了不到一千塊。雖然一直處於自生自滅的狀態,但卻用戶數最多。05年的時候曾統計過各大網站的下載量,當時就達十幾萬的下載量,時至今日,相信用過這個軟件的人數,絕不是一個小數目。盡管差不多十年沒有更新了,仍然不時有用戶找到我要注冊碼,或者提出改進建議。曾經在《電腦報》上被刊文介紹,還被收錄到幾本雜志的光盤中。
第二個:淘寶發布大王
賺到了十萬多一點。這一次總算把握住了先機,模仿者無數。后來由於環境變化,軟件失去了價值,自然消失。雖然賺的錢不算多,但卻在一定程度上改變了我的生活,因為靠着這十萬元,在這個寸土寸金的大城市里,我終於有了一塊自己的立足之地。
第三個:易創招標通
這次野心最大,花我精力最多,卻只賺了幾千塊,最后徹底放棄。這一次給我留下了太多的經驗教訓,估計一輩子我也不會忘記。
本人拙作《程序員第二步-從程序員到項目經理》已經由人民郵電出版社出版,當當網京東網均可預訂,謝謝各位園友們的長期大力支持!
第一篇:隱藏專家-打造一款很多人用的軟件
從當程序員的那一天起,我就一起有一個夢想,就是開發一款有很多人用的軟件,果能如此的話,這一生也算是有所價值,沒有白過。我第一次開發的共享軟件,隱藏專家,差點就實現了我的這個夢想。雖然一直處於自生自滅的狀態,但用戶並不少,光多特網站的下載量就達5萬多,相信用過這款軟件的人,總該有幾十萬吧。盡管差不多十年沒有更新了,仍然不時有用戶找到我要注冊碼,或者提出改進建議。曾經在《電腦報》上被刊文介紹,還被收錄到幾本雜志的光盤中。
隱藏專家是一個很簡單的軟件,它的功能可以用一句話說清楚:按下快捷鍵,立即隱藏指定的窗口和托盤圖標。開發這個軟件,最開始是給自己用的,當看到領導朝這邊走來時,我輕輕按下Alt+X,QQ窗口、IE瀏覽器,連接QQ托盤圖標全部都會消失的得無影無蹤。
隱藏專家是2002年用Delphi開發的。寫這個軟件,還有一個目的,就是學習。我當時對於寫程序還是初入門,對於程序代碼是怎樣工作的,還一點也不懂。通過開發隱藏專家,我對Windows消息機制,終於有了比較清楚的認識,同時也學會了不少Windows API的用法。
這里要感謝一下“大富翁論壇”,這是一個當年非常火爆的Delphi技術論壇,從上面我下載了一個近300M的離線資料,至今還保存在我的移動硬盤上。我幾乎把每一篇都看過,實在是受益匪淺,可以說,大富翁論壇就是我的啟蒙老師。
下面介紹一下這個小軟件所用的到一些關鍵技術:
1.窗口隱藏:
要隱藏窗口,首先要找到窗口,就是遍歷所有的窗口(FinWindow, GetWindow兩個API),然后看窗口標題文字是否符合設定的條件,如果符合,就隱藏或顯示該窗口(ShowWindow),這些都是通過Windows API來實現的。
主要代碼如下所示:
procedure HideWindow(WinList:TStringList);
var
hCurWindow:HWND;
WinText:Array[ 0.. 255] of 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的工具條窗口中,既然如此,應該可以有相應的方法,讀出工具條某個按鈕的文字信息,以及通過發送消息將其顯示或隱藏。順滕模瓜,最后終於找到了解決方法:
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.. 255] of 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, 0, 0);
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