2010年12月3日 星期五

Android開發:multiple webview render bug

被一個奇怪的問題搞了好幾天..在這邊記錄一下
由於專案需求,需要在一個activity中使用到兩組數據
那些數據是以Html方式儲存
所以就以簡單的linearlayout+webview.loadurl處理
然後就結束了!

才怪..這麼簡單解決就不用寫文了 XD
我碰到的問題是android render html時,總是只出現其中一組
把該組拿掉,第二組才會出現
debug沒有報錯下,我往layout編排錯誤的方向尋找了二天依然沒結果
後來使用scrillview內包webview的方法終於讓兩個webview都能同時出現
不過很醜..
剛剛心血來潮又測試了一下,這次把兩個webview的順序對調後,發現兩個都可以出現了!?
可是位置重疊了??

推敲了一下
由於兩組檔案其中有一組比較小,render時間比較短
先執行這組時,就可以兩組一起出現
因為猜測是android render layout webview時,高度是動態的
當先執行內容多的webview再執行內容少的webview時
後者先執行完畢但前者尚未執行完畢,因此後者認為前者高度為0就直接貼了上去
而等前者執行完畢後,就把後者覆蓋掉,因此只看得到這組資料

我是覺得這行為很弔詭..
為什麼前者執行完畢後,無法調整高度呢?

不過暫時時間不多,等之後搞定其他的部份再來調整這塊
應該可以讓他們兩者按照順序執行或乾脆把兩組數據整合在一起

2010年12月2日 星期四

Airport Express error code 15006錯誤兼設定教學

這幾天因為太認真工作,結果購物慾望發作
想了一下,就買了台airport express, 想說這樣拿著NB到處走的時候就不用每次都要拔喇叭
貨到很快,包裝維持了Apple一貫的簡潔與環保
快樂的接上網路線設定完之後拔到喇叭旁邊接上
興奮的開啟iTunes... god damn it, Error 15006
查了一下,這問題是陳年舊疾
至少2009年初就發病了(靠..這麼久都還沒修好

找得到的解法有好幾種
最簡單的:
關掉nb上的airport, 過幾分鐘再打開讓他重新搜尋(這期間iTunes不要關掉)
可是這招在我這無效 orz

之後調整了一下
在Airport程式中,給了揚聲器密碼後
就一切順利..

這邊說一下我的環境
我這邊已經有一個無線ap,設定好了無線網路1
然後把Airport Express接到插座
開啟Airport工具程式
設定為加入無線網路,讓他加入無線網路1
如果無線網路有密碼就設定密碼(我是用Mac, 所以不確定windows上面會不會自己帶密碼進去)
接下來選Airport工具程式上面的音樂選項
Airtunes預設是啟用的
這邊隨便給個密碼就好

然後開啟iTunes, 在右下角切換喇叭測試就知道有沒有成功了

除錯心得
15006應該是一個iTunes找不到Airport Express上喇叭或無法取得喇叭權限的錯誤
不確定原因,不過看來給予密碼可以跳過這一問題就是了

使用心得
Airtunes(竟然)只能在itunes中使用..
而且只接受itunes的音量控制,機器上的音量調整對他無用 orz
大概會吃掉120-140KB/s的上傳網路
開網頁時,還是要另外接喇叭或使用mbp上的喇叭..
這設計太殘廢了吧(翻桌)

2010年11月23日 星期二

開Paralles開啟執行Eclipse寫Anroid發生AVD錯誤

因為Mac上的java效率太差,導致Eclipse反應很慢
所以只好開Paralles來測試這樣做可不可行
不過測試途中碰到avd無法開啟的錯誤
具體錯誤剛忘了抓,應該是emulator error: xxxxxx

這錯誤的原因和我把win使用者目錄和mac使用者目錄連結有關
因為avd預設會放在win使用者目錄下
可是eclipse沒有權限使用
執行建立AVD指令後,雖然沒有報錯但事實上沒有執行成功
判斷方法是點虛擬機,然後看他的位置(右邊detail)

修改方法
在win控制台新增系統變數 ANDROID_SDK_HOME <--這名稱不可改變
輸入想要擺AVD的目錄,關掉eclipse重新開啟就可以了

參考資訊
http://www.cnmsdn.com/html/201009/1284078505ID7892.html

2010年11月15日 星期一

Eclipse 主題設定、編輯環境、editor theme設定說明

剛剛花了點時間在設定eclipse的theme上
不知道是我用錯關鍵字還是怎樣,總之在中文文章中一直找不到有用的說明(攤手
因此在這邊註記一下好了


其實我是Eclipse新手,以下可能是錯誤的推論,只有結果是正確的
所以,你看到這文章時,請知道怎麼做就好,萬一發現有錯誤,請幫忙留言更正

以下環境為Eclipse 3.5,Mac/Win/Linux應該都適用
在Eclipse中,editor color不是獨立存在的設定,而是和preference相依的
所以,要使用網路上其他人設定的theme時,不能直接import
必須要先將自己的eclipse preference匯出後
清除裡面的syntax顏色設定
然後將相關設定加到裡面
再次匯入才可以使用

以vibrantInk主題為例
修改的具體步驟是
  1. File->export-> 選擇general下面的preference後,匯出
  2. http://srand2.blogspot.com/2009/08/eclipse-color-themes.html 中連結到 https://eclipsecolorthemes.jottit.com/ 看一下說明
  3. https://eclipsecolorthemes.jottit.com/vibrant_ink copy 設定
  4. 開啟剛剛匯出的檔案
  5. 清除顏色設定(不過我在3.5.2 on mac 上找不到這幾行..),包括/instance/org.eclipse.jdt.ui/semanticHighlighting.staticField.enabled=false

    /instance/org.eclipse.ui.editors/AbstractTextEditor.Color.Background.SystemDefault=false

    /instance/org.eclipse.ui.editors/currentLineColor=45,45,68
  6. 在最後面加入 3 中複製的設定,並儲存
  7. File -> Import -> 選擇剛剛修改的檔案
然後就完成了

google關鍵字:eclipse color theme

2010年11月4日 星期四

從壞掉的硬碟copy檔案急救過程

有朋友硬碟壞了,需要把裡面的資料救出來

以下是..急救過程
0. 清除垃圾檔案、不需要的檔案
*.tmp(程式暫存檔), pagefile.sys(系統暫存檔)
如果有遊戲程式,如這次的wow就有4G的patch檔
這過程可以說很重要也可以說不重要
不過建議是先處理一下比較好
首先是可以縮減需要處理的檔案數量及大小,所以可以縮減處理時間
再來,萬一壞掉的磁區就在這些檔案中的話,那之後需要處理的問題就少很多
所以基本上是沒有害處的
唯一要注意的是,記得先看裡面有沒有圖檔或使用者抓取的遊戲畫面檔案或設定資料,有的話記得先撈出來

1. 先使用roadkil's unstopped copier,在settings中選擇 undamaged files first(中文翻譯很怪,未受損資料優先之類,所以一開始我沒有注意到這選項
使用這軟體的原因是因為硬碟壞軌後,複製時可能會碰到壞軌,但也有可能在其他資料中碰到其他錯誤(crc錯誤)
我本來使用teracopy想快速複製,結果碰到壞軌卡住
然後使用xcopy, 結果碰到記憶體不足問題,這問題好像容易伴隨硬碟壞軌一起發生
最後才使用unstop copier處理
雖然是unstop, 不過進行的速度實在不能說快..
(ps:指令碼為xcopy /c /f /e /k /-Y /r source_folder target_Folder
/c:忽略錯誤,避免出現錯誤時停止複製
/f: 顯示處理的檔案全名
/e: 完全複製,就算是空目錄/空檔案也會複製
/k: 複製檔案屬性,xcopy預設複製出來的檔案屬性為唯讀
/-Y:碰到問題由程式回答Y

2. 使用hd regenerator修復壞軌:
winxp內建的chkdsk雖然很多人用
不過在這次的處理中完全~沒派上用場
不管查幾次都沒有查到錯誤(其實我懷疑他是幾個檔案資料毀損而已)

進行中

雖然有看到recoverSoft的media tools pro不錯用
不過實在找不到可用的下載
(說到這個,我實在有點受不了這些系統軟體商的定價策略)

2010年11月1日 星期一

在xcode上使用檔案系統建立簡單的svn

由於設定網路svn設定的有點火大
決定先從檔案系統svn處理起

參考文章http://it-nonwhizzos.blogspot.com/2010/05/simple-single-user-subversion-with.html

這篇寫的不錯,不過
大致步驟如下
0. 環境:要安裝subversion, mac好像有內建

1. 使用svadmin建立一個repository
最好是在自己的目錄下,不然會有煩人的權限問題
svnadmin create /Users/xxx/svn

2. 在xcode中設定scm,scheme用file
並將path指定到該目錄
ex: file:///Users/xxx/svn

3. 使用import匯入專案到repo
如果出現 no such table rep_cache,就到svn目錄下的db修改設定
sudo ee db/fsfs.conf, 把# enable-rep-sharing = false取消註解

4. 刪除原始檔案,進入SCM並checkout出來到自己要的目錄
5. 設定專案的scm到這repo中

其實下面還有一些設定是關於設定xcodeproj為專案檔而非文字檔
不過xcode 3.2中好像已經有版號功能的樣子
因此就暫時跳過不處理,以後出問題再說 XD
cd ~/Code/MyApp/MyApp.xcodeproj
svn propset svn:mime-type application/octet-stream jbm.mode1v3
svn propset svn:mime-type application/octet-stream jbm.pbxuser


至於使用網路連線,可以看這篇試試看
http://yfchen58.blogspot.com/2009/11/mac-os-x-106-svn.html
想更進階的話
http://www.dotblogs.com.tw/remhom/archive/2010/10/13/18308.aspx

2010年10月31日 星期日

手機和最後一哩的相關文章

今天和朋友聊天,聊到了iPhone以及在上面開發/使用程式的一些特性
這其中最大的差別在於使用者行為
使用iPhone/智慧型手機的行為和使用電腦是不同的
大致上可以從幾個角度來看

1. 環境&2.時間
這兩者很難明確切分開來,起碼在簡單的討論中是如此(哪天我寫論文再明確拆開)
使用電腦時,有80%都是坐在椅子,電腦放在桌子上的,就算是nb或一些懶骨頭也一樣
我現在一天大約1小時都是躺在床上,把nb放在腳上上網
說實話,那不是一件很..輕鬆的事情
當然坐在椅子上看電腦也不是
iPhone當然不夠大、不夠快(也許iPad會比較好一點)
不過基本上,iPhone/SmartPhone(SP)的使用環境與電腦是截然不同的
捷運、公車、出門在外(搭3G)的時候都可以使用
如果以時間管理角度來看,這叫做零散時間的運用
這些零散時間也許發呆、也許想一些事情,不過有iP/SP的話,就可以上網
這也是為何一堆小遊戲流行的原因,因為會玩這些遊戲的時機大概都是這種零散時間


3. 目的:
使用電腦時,通常有一些明確的目的,也許是找東西或是單純的休閒逛網頁殺時間
但是使用手機時,大概有80%都是在殺時間
也就是說這群使用者可能沒有明確的目的
這種情況下,使用者比較會注意廣告,投放的效過可能較大(需找證據確認)
當導向行銷目標時,建立購物衝動的機會也較大的
當然這也要搭配一些策略
A. 讓app醒目、讓使用者願意使用或能夠在上面建立黏著性
搭配notifier, 購物清單、註冊產品列表之類常用功能,讓使用者想到該公司相關產品時就可以回到app查詢並建立再次行銷機會是一個不錯的點子
b. 使用電子報或其他行銷方式促使使用者登入網站/app
這招好像很多行銷公司發現了?起碼中國信託就是用這招拉我回去網站的
c. 定時登入取得折價卷或其他折扣




keyword: Last Mile Marketing
http://lastmilemarketing.blogspot.com/

相關文獻:
「最後一哩」的行銷魔法 - 讓選購者變成購買者

2010年10月30日 星期六

關於三種比較紅的腳本語言:ruby/python/perl

我只有用過ruby和python
不過這一篇文章寫的不錯
Ruby,Python,Perl 中心思想的不同

個人結論
python是拿來寫大程式用的
perl用來趕工
ruby介於中間,易懂且好維護,不過效能上可能比不上python或優化過的perl內容?<--待確認

不過使用腳本語言(python/ruby限定)寫程式蠻爽的,最主要是因為不用想太多關於資料格式和記憶體的問題(當然也要機器夠力)
如果iPhone可以用ruby或python寫的話,生產力應該會提高許多

2010年10月25日 星期一

修改mac的fn key/調換fn key和ctrl key

由於實在受不了在左下角的fn key,所以決定找個軟體調換左下的fn key和ctrl key
(注意:如果你的鍵盤上有兩個ctrl key,那使用前請確認你可以接受兩個fn key :p )

我用的程式是keyremap4macbook
http://pqrs.org/macosx/keyremap4macbook/index.html
這程式更新的蠻勤的,感覺上應該會不錯用
使用前要注意別和其他的keyboard remap軟體共用,可能會有相衝問題
下載安裝完後需要重新開機
然後看http://pqrs.org/macosx/keyremap4macbook/document.html這網頁的圖應該就可以了解怎麼使用了
移除的方法也在這網頁中

--
我放棄這作法了
remap fn/ctrl之後,有些程式可以正常運作
但是像welly之類的bbs程式中,fn/ctrl都沒有作用
簡單來說,程式效果不穩定
所以放棄,除非有更底層的remap程式出現,不然暫時不考慮使用這類程式了

Window與MAC使用上的個人感想

我是用Dell E6400與MBP 15"(2010年)作比較的
我是寫程式的人,不過由於沒有desktop,所以都是用這兩台NB瀏覽網頁和寫程式
MAC我大概用了一年,不過最近一個月都只有用MAC,原因很簡單,我正在寫iPhone程式
在一個月之後,我重新回頭摸dell的NB,發現dell的鍵盤真的比MBP好按很多 XD
此外,也發現MAC和window的一些使用感覺上的差別

這篇不講系統優劣,只單純的描述和比較我在這兩台分別安裝MAC和Window的NB上使用的感覺

先說結論,如果是要處理大量的打字工作,我會選擇使用Dell NB+windows
原因主要是鍵盤的手感(這一個和機器有關,但使用過的mac鍵盤中,沒有真正順手的鍵盤)
以及滑鼠的靈敏度

其實,由於mac和win很多功能在對方系統中都有對應,就算沒有也可以找程式安裝支援
大概只有Visual Studio和Xcode這種東西無法互通
所以以上的結論主要是根據這兩個系統中我覺得無法靠安裝程式搞定的部分而來

由於鍵盤和機器有關,這邊就不講,單論滑鼠靈敏度問題就好
01上面有人提過Mac的滑鼠移動/偵測目標方式和windwos不同
windows的速度是固定的,而mac的滑鼠移動速度則是曲線型的
mac的好處是可以在短距離內移動指標到整個畫面上任何一個角落
搭配上他的大面積觸控板後,非常的便利,這一點window是比不上的

但是另一方面,mac和window的滑鼠點擊偵測方式有很大不同,這一方面就是window勝利了
在mac上面選擇目標是一件很令人挫折的事情,尤其是和win比較的話
在windows上面,從win31以來,我只有滑鼠指標滑不到位置的問題,沒有誤點的問題
但是這一點在mac上面,起碼在OSX 10.6之後都還無法做到
也就是說,我點目標時,常會出現點不到或點錯的情況
這問題在打字要移動游標到合適的位置時特別嚴重

另一個例子是在檔案的移動上
在windows上面的檔案總管選擇檔案非常輕鬆,但是在mac上面同樣的操作很容易令人沮喪
我用了快一年,現在點選檔案/目錄進行移動時依然會操作錯誤
最常出現的問題是選好檔案後要移動到其他目錄會變成選擇檔案


順便講一下兩者的快速鍵設計差別好了
基本上,mac的快速鍵都是以雙手手指為目標的
而windows則比較亂,但是很多都可以單手操作,因此右手可以不用離開滑鼠,所以我比較喜歡windows的快速鍵設計概念
但是mac的快速鍵很多且方便,代表性的差別就是複製以及移動到行頭的快速鍵
windows上的複製是ctrl+C,左手小指+食指就可以操作
MAC則是command+C,由於左方command的位置和C很近,因此不好按,比較順手的是右手command+左手按C
不過這樣按就要把手離開滑鼠了..
而移動到行頭/尾的話,windows上用home/end
MAC則是command+左/右箭頭,這一個是MAC順手

題外話,mac有提供alt+左右移動游標的功能,這功能是以單字為區隔游動游標(就是說可以從單字頭跳到另一個單字頭)
不過在中文環境無法發揮效用..因為中文每個字之間沒有空白讓他判斷..
但在英文環境就很有用了,例如寫程式上面
前面有說過,在MAC上我用滑鼠點擊常出現無法一次到位的情況,所以在MAC上寫程式時,我其實比較常用鍵盤移動游標
windows上其實也有這功能,是ctrl+左右
不過windows的滑鼠比較好用...所以我以前沒注意過 :p
(這蠻弔詭的就是了,我忽然覺得我會認為mac快速鍵好用的原因很可能是因為在windows上我用滑鼠就能達到的功能在mac上做不到,所以才開始注意mac的快速鍵設計,因此反而覺得mac的快速鍵設計得很棒..)

MAC上還有一些windows上沒有的優良設計
mac在fn上放了許多功能,除了win NB上也有的鍵盤亮度、螢幕亮度之類的功能之外,有兩個是windows上沒有的
單鍵顯示目前開啟的程式和顯示常用小工具
其實單鍵顯示目前開啟的程式在window上不太需要,因為windows有工作列
不過mac的工作列無法明確顯示有開啟哪些程式..ㄟ,也不是無法顯示,但是相較起來不太明顯
我猜可能是因為這原因所以才有這設計
先不管要多按一個鈕這不便性,mac的清單比較華麗易懂(用整個螢幕來顯示工具列內容還做不到比較易懂就該打屁股了 :p)
不過windows的工具列真的比較方便..
擺一個常用程式清單在螢幕上占空間,然後再放一個按鈕讓人查詢現在開啟的程式?
雖然介面比較華麗,不過我真的覺得這有點...為華麗而犧牲便利

顯示常用小工具清單功能其實在win上也有類似的,就是工作列捷徑...
恩,不過由於工作列捷徑只有一個icon,不太容易辨認,所以這一項我投mac一票

另外,mac把fn放最左下角這作法我覺得和堅持單鍵滑鼠一樣白癡
mac上雖然ctrl比較沒有在用,不過fn使用的機會更少吧?
而預設的key mapping中竟然沒有提供fn的對應,讓人想改都沒機會..

mac上有預設的多桌面系統(用過xwin或linux的應該都很愛這個功能)
windows上其實有這種軟體可以安裝,不過..MS能提供的話其實也不錯
(有興趣的人可以參考http://briian.com/?p=5146這篇提供的程式看看)

2010年10月24日 星期日

ASUS WL-520GU 刷tomato的技巧

我根據這篇 ASUS WL-520GU刷Tomato RAF 1.23韌體 進行刷機後,一直無法成功
參考了http://www.dd-wrt.com/wiki/index.php/Asus_WL-520GU這邊才發現原因

WL520GU有一個回復模式,開機前就按著reset會進入回復模式
這時候才可以使用tftp上傳軔體刷機
刷完之後別急著拔,等各一分鐘後讓他自行開機後才可以拔掉電源重開
不過這部份沒有任何可見的提示,所以去上個廁所、翻個網頁等幾分鐘後再執行下一個動作吧

至於回復預設值的動作要等到開完機(power一直亮著)時執行
這時候按著reset就會進入回復預設值模式

我是使用這邊的http://victek.is-a-geek.com/tomato.html所提供的Kernel 2.4下的Tomato RAF 1.28.8520 ND + USB + VPN. Version for ASUS WL-500gP, 520gU and in general for MIPSR1 USB Routers.檔案刷機

用這檔案後,回復預設值動作無效,然後也沒有原文中第六步驟提及的選項
6.到Administration --> Backup Configuration --> Restore Default Configuration --> Erase all data in NVRAM memory (thorough),清除NVRAM所有儲存資料。

應該是1.28和1.24在這部份有不同
不過目前使用起來沒有其他問題,所以..就先這樣吧 XD

--
我的WL520GU是2010 3月左右買的
使用 kernel 2.6核心會有問題:刷機後無法離開回復模式
個人猜測可能和flash memory大小有關,因為懶得找原因,所以就用kernel 2.4的

2010年9月30日 星期四

windows 如何判斷64位元環境

由於很多的原因,所以要在windows上面偵測64位元環境的最好方法還是使用WMI比較方便

這邊是一個簡單範例
public static bool DetectIf64bit()
{
bool Is64Bit;
ObjectQuery objQry;
ManagementScope mngScope;
ConnectionOptions connOpt = new ConnectionOptions();
ManagementObjectSearcher searcher;

//-----設定 WMI 連接資訊-----
connOpt.Username = ""; // 登入系統的帳號
connOpt.Password = ""; // 密碼
connOpt.Authentication = AuthenticationLevel.Default; // 連線驗證方式
mngScope = new ManagementScope();
mngScope.Path = new ManagementPath(@"\\.\root\cimv2");
mngScope.Connect();

//----- 透過WMI擷取CPU定址長度資訊
objQry = new ObjectQuery("SELECT * FROM Win32_Processor");
searcher = new ManagementObjectSearcher(mngScope, objQry);
Is64Bit = false;

foreach (ManagementObject QryObj in searcher.Get())
{
if (QryObj.GetPropertyValue("AddressWidth").ToString().Trim() == "64")
{
Is64Bit = true;
break;
}
}

return (Is64Bit);
}

Winform下comboxBox處理 找出下拉選單對應值

winform下的下拉選單是各很機車的設計..

datasource程式碼
DataTable p_dt = dbHelper.mtdExecuteDataTable(p_exec);
DataRow emptyRow = p_dt.NewRow();
emptyRow["code_desc"] = "";
emptyRow["code_id"] = " ";
p_dt.Rows.InsertAt(emptyRow, 0);
cmbBox_paymentType.DataSource = p_dt;
cmbBox_paymentType.DisplayMember = "code_desc";
cmbBox_paymentType.ValueMember = "code_id";
cmbBox_paymentType.SelectedIndex = 0;

使用非datatable作為來源時,另建一個簡單類別或自訂table設定columns也可
如DataTable dt = new DataTable("tbl");
dt.columns.add("0", Typeof(System.string));
dt.columns.add("1", Typeof(System.string));
DataRow row;
for(int i=0;i<2;i++) {
row = dt.newrow();
row["0"] = i;
row["1"] = i+1;
dt.row.add(row);
}

在已經有資料要挑選正確的項目作為預選項目時
將dropdownobx的items以datarowview處理即可
大致程式碼會如下

if (!string.IsNullOrEmpty(p_bo_tblinvoice_out.code_desc))
{
int i=0;
foreach (DataRowView _drv in cmbBox_paymentType.Items)
{
if (_drv.Row["code_desc"].ToString().Contains(p_bo_tblinvoice_out.code_desc))
cmbBox_paymentType.SelectedIndex = i;
i += 1;
}
}

2010年9月17日 星期五

刪除被鎖定的檔案

如果你是尋找可以立即使用的軟體,那這篇對你無用
這篇是針對如何使用程式刪除檔案的筆記 (意思就是我看了但還沒測試 :p

原始網頁 http://stackoverflow.com/questions/317071/how-do-i-find-out-which-process-is-locking-a-file-c

1. 使用MS的Handle v3.42工具輔助
下載http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx
使用以下程式碼呼叫

 string fileName = @"c:\aaa.doc";//Path to locked file

                Process tool = new Process();
                tool.StartInfo.FileName = "handle.exe";
                tool.StartInfo.Arguments = fileName;
                tool.StartInfo.UseShellExecute = false;
                tool.StartInfo.RedirectStandardOutput = true;
                tool.Start();                   
                tool.WaitForExit();
                string outputTool = tool.StandardOutput.ReadToEnd();

                string matchPattern = @"(?<=\s+pid:\s+)\b(\d+)\b(?=\s+)";
                foreach(Match match in Regex.Matches(outputTool, matchPattern))
                {
                        Process.GetProcessById(int.Parse(match.Value)).Kill();
                }

2. 取得process陣列,判斷是哪各process鎖定檔案
不過原作者說這作法無法取得txt之類的鎖定來源


using System.Management; using System.IO;   
static class Module1 { static internal ArrayList myProcessArray = new ArrayList(); private static Process myProcess; 
public static void Main() { 

    string strFile = "c:\\windows\\system32\\msi.dll"; 
    ArrayList a = getFileProcesses(strFile); 
    foreach (Process p in a) { 
        Debug.Print(p.ProcessName); 
    } }
private static ArrayList getFileProcesses(string strFile) { 
    myProcessArray.Clear(); 
    Process[] processes = Process.GetProcesses; 
    int i = 0; 
    for (i = 0; i <= processes.GetUpperBound(0) - 1; i++) { 
        myProcess = processes(i); 
        if (!myProcess.HasExited) { 
            try { 
                ProcessModuleCollection modules = myProcess.Modules; 
                int j = 0; 
                for (j = 0; j <= modules.Count - 1; j++) { 
                    if ((modules.Item(j).FileName.ToLower.CompareTo(strFile.ToLower) == 0)) { 
                        myProcessArray.Add(myProcess); 
                        break; // TODO: might not be correct. Was : Exit For 
                    } 
                } 
            } 
            catch (Exception exception) { 
            } 
            //MsgBox(("Error : " & exception.Message)) 
        } 
    } 
    return myProcessArray; } }


3.算是進階版?
using System;
using System.Collections;
using System.Diagnostics;
using System.Management;
using System.IO;
static class Module1
{
    static internal ArrayList myProcessArray = new ArrayList();
    private static Process myProcess;

    public static void Main()
    {
        string strFile = "c:\\windows\\system32\\msi.dll";
        ArrayList a = getFileProcesses(strFile);
        foreach (Process p in a)
        {
            Debug.Print(p.ProcessName);
        }
    }

    private static ArrayList getFileProcesses(string strFile)
    {
        myProcessArray.Clear();
        Process[] processes = Process.GetProcesses();
        int i = 0;
        for (i = 0; i <= processes.GetUpperBound(0) - 1; i++)
        {
            myProcess = processes[i];
            //if (!myProcess.HasExited) //This will cause an "Access is denied" error
            if (myProcess.Threads.Count > 0)
            {
                try
                {
                    ProcessModuleCollection modules = myProcess.Modules;
                    int j = 0;
                    for (j = 0; j <= modules.Count - 1; j++)
                    {
                        if ((modules[j].FileName.ToLower().CompareTo(strFile.ToLower()) == 0))
                        {
                            myProcessArray.Add(myProcess);
                            break;
                            // TODO: might not be correct. Was : Exit For
                        }
                    }
                }
                catch (Exception exception)
                {
                    //MsgBox(("Error : " & exception.Message)) 
                }
            }
        }

        return myProcessArray;
    }
}