程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 進程查看器1.3版開發後記

進程查看器1.3版開發後記

編輯:Delphi
終於趕在元宵節這天發布“進程查看器1.3版”,順便將它的中文版名字改為“05元宵版”。“進程查看器”一直都是用休息時間編碼的,雖然1.3版增加的功能不多,但也耗用了好幾天的下班時間。開發過程中還是有點東西需要記錄下來,免得以後又忘記了。
  
  一、查找主窗體
  通過特定的窗體句柄查找主窗體,這是以前做過的功能,隨手寫出以下代碼:
  
    if hWnd <> 0 then
          while GetParent(hWnd) <> NULL do hWnd := GetParent(hWnd);
  在調整時發現竟然會死循環,把循環改為while GetParent(hWnd) <> 0後正常,後來才想起我以前在CSDN回答過別人的這個問題,發現自己起來越沒記性了。

  二、最大化窗口的矩形區域
  通過窗體句柄計算窗體矩形區域並畫虛線提示框也是以前做過的功能,不過源碼在家裡,這趟只得重新編寫。但是在我現用的Win2000系統中,最大化窗體的矩形區域左上角竟然是(-4,-4),且寬度也比屏幕寬度多了4,想來可能是Windows有意這樣處理窗體,讓它那個3D的邊框顯示在屏幕之外。印象中我上次做這個功能時並沒有這個問題,不知是不是以前沒注意到。

  三、取進程的內存用量
  在Win2000下很容易實現,用GetProcessMemoryInfo就可以了,而且有任務管理器可以對比。而在Win98/ME下就麻煩多了,最後使用了下面的代碼,但得到的數值很大,沒得對比的情況下只能這樣了。
  
    iFlag := VirtualQueryEx(hndProcess, lpAddr, mi, SizeOf(mi));
      repeat
          LongWord(lpAddr) := LongWord(mi.BaseAddress) + mi.RegionSize;
          if LongWord(lpAddr) > $7fffffff then break;
          if mi.State = MEM_COMMIT then Inc(iTotalCommit, mi.RegionSize);
          iFlag := VirtualQueryEx(hndProcess, lpAddr, mi, SizeOf(mi));
      until iFlag <> sizeof(mi);

  四、GetWindowThreadProcessId
  DWORD GetWindowThreadProcessId(HWND, LPDWORD)可以返回兩個值,一個是函數本身的返回值,另一個LPDWORD指向的變量,LPDWord才進程ID。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved