共享軟件這個詞,現在彷佛離咱們已經愈來愈遙遠了。還有人有用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..
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的工具條窗口中,既然如此,應該能夠有相應的方法,讀出工具條某個按鈕的文字信息,以及經過發送消息將其顯示或隱藏。順滕模瓜,最後終於找到了解決方法:
//取得托盤區圖標列表所在的窗口句柄,是一個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