程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Windows平台API積累

Windows平台API積累

編輯:.NET實例教程
  1. OpenProcessToken 
    要對一個任意進程(包括系統安全進程和服務進程)進行指定了寫相關的訪問權的OpenProcess操作,只要當前進程具有SeDeDebug權限就可以了。要是一個用戶是Administrator或是被給予了相應的權限,就可以具有該權限。可是,就算我們用Administrator帳號對一個系統安全進程執行

    $False$

    EN-US" >OpenProcess(PROCESS_ALL_Access,FALSE,          dwProcessID)還是會遇到“訪問拒絕”的錯誤。什麼原因呢?原來在默認的情況下進程的一些訪問權限是沒有被置為可用狀態(即Enabled)的,所以我們要做的首先是使這些權限可用。與此相關的一些APIbidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">函數有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我們要修改一個進程的訪問令牌,首先要獲得進程訪問令牌的句柄,這可以通過OpenProcessToken得到,函數的原型如下:
    BOOL      OpenProcessToken(
               HANDLE      ProcessHandle,       //要修改訪問權限的進程句柄
               DWord      DesiredAccess,        //指定你要進行的操作類型
               PHANDLE      TokenHandle         //返回的訪問令牌指針
         );
    成功返回非0;-SA; mso-fareast-font-family: 宋體">
    第一參數是要修改訪問權限的進程句柄;
    第三個參數就是返回的訪問令牌指針;
    第二個參數指定你要進行的操作類型,如要修改令牌我們要指定第二個參數為TOKEN_ADJUST_PRIVILEGES(其它一些參數可參考Platform          SDK)。通過這個函數我們就可以得到當前進程的訪問令牌的句柄(指定函數的第一個參數為GetCurrentProcess()就可以了)。接著我們可以調用AdjustTokenPrivilegesso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">對這個訪問令牌進行修改。
    包含頭文件Winbase.h

  2. LookupPrivilegeValue
    獲取當前系統上,指定權限名字的唯一標志(LUID),函數原形如下:
    BOOL LookupPrivilegeValue(
      LPCTSTR lpSystemName,
      LPCTSTR lpName,
      PLUID lpLuid
    );
    成功返回非0;
    參數說明:
    lpSystemName
     [in]傳入參數,字符傳指針;指定需要獲取權限的操作系統名字,如果傳入null,那麼將在本地系統上查詢指定權限名的LUID;
    lpName
     [in]傳入參數,字符串指針;指定需要查詢LUID的權限名字,可以系統中定義了的權限產量(如SE_SECURITY_NAME),也可以是一個自己定義的字符串(如"SeSecurityPrivilege");
    lpLuid
     [out]傳出參數,字符串指針; 傳出權限名字指定的LUID;
    包含頭文件Winbase.h
  3. AdjustTokenPrivileges
     根據指定的權限令牌,置進程的權限為可用或不可用;
     函數原型:
    BOOL AdjustTokenPrivileges(
      HANDLE TokenHandle,
      BOOL DisableAllPrivileges,
      PTOKEN_PRIVILEGES NewState,
      DWord BufferLength,
      PTOKEN_PRIVILEGES PreviousState,
      PDWord ReturnLength
    );
    參數說明:
    TokenHandle
    [in]包含需要修改權限的令牌句柄.這個參速需要有TOKEN_ADJUST_PRIVILEGES權限.如果參數PreviousState=NULL,那麼句柄已應該擁有TOKEN_QUERY權限.
    DisableAllPrivileges
    [in]是否置所有的權限為不可用狀態.如果值=TRUE,使所有的權限不可用,並且忽略NewState參數.如果為FALSE,那麼該函數將修改這些權限為NewState參數所指的狀態.
    NewState
    [in]指向一個描述權限屬性的TOKEN_PRIVILEGES結構數組.如果DisableAllPrivileges=FALSE,那麼AdjustTokenPrivileges將使數組中指向的屬性為可用,不可用狀態或者刪除.
       系統中定義的三個常量SE_PRIVILEGE_ENABLED,SE_PRIVILEGE_ENABLED,SE_PRIVILEGE_REMOVED.
      Windows XP/2000/NT中,不能刪除權限
    BufferLength
    [in] 以字節為單位指定了PreviousState所指緩沖buffer的長度,如果PreviousState參數為NULL,那麼BufferLength可以被置為0.
    PreviousState
    [out] 傳輸AdjustTokenPrivileges參作將修改的屬性的修改前狀態,可以被置為NULL;
    ReturnLength
    [out] 返回PreviousState請求字節長度,如果PreviousState=NULL,這個參數可以為NULL;
    包含頭文件Winbase.h
  4. OpenProcessToken ,LookupPrivilegeValue,AdjustTokenPrivileges引用舉例
    BOOL EnableDebugPrivilege(BOOL fEnable) {
    BOOL fOk = FALSE;    // Assume function fails
    HANDLE hToken;
       //以修改選項,獲取當前進程的令牌環
       if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,&hToken))
       {
          TOKEN_PRIVILEGES tp;
          tp.PrivilegeCount = 1;
       //獲取debug權限的luid
          LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
       //將權限屬性置為可用
          tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
       //修改權限
          AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
          fOk = (GetLastError() == ERROR_SUCCESS);
          CloseHandle(hToken);
       }
       return(fOk);
    }
  5. GetDlgItem
     獲取對話框中指定資源的句柄
     原型:
     HWND GetDlgItem(HWND hDlg,//對話框句柄
       int nIDDlgItem //資源id
     )
     如果成功,返回指定控件的句柄;如果失敗返回NULL;
  6. ShowWindow
     控制窗口或者控件的顯示模式(其實控件也是一個窗口).
     BOOL ShowWindow(HWND hWnd,//窗口句柄
        int nCmdShow//模式,如SW_HIDE隱藏,SW_MAXIMIZE最大化,SW_MINIMIZE最小化等.
     );
     如果之前窗口是顯示的,那麼返回非0;之前窗口是隱藏的,返回0;
  7. GetStockFont
     獲取指定類型的畫筆,畫刷等字體原料;
     HGDIOBJ GetStockObject(
       int fnObject   //字體類型,如SYSTEM_FONT系統字體,DEFAULT_PALETTE默認調色板等;
     );
     成功,返回獲取到的對象;失敗返回0;
  8. GetDC
     獲取設備上下文
     HDC GetDC(
       HWND hWnd   //窗口或者控件句柄,如果hWnd=NULL,那麼將獲取整個屏幕的上下文
     );
     成功,返回指定區域的設備上下文;如果失敗,返回NULL;
  9. RedrawWindow
     更新指定的矩形區域
     BOOL RedrawWindow(
       HWND hWnd,               //窗口句柄
       CONST RECT *lprcUpdate,  //需要更新的矩形區域指針
       HRGN hrgnUpdate,         //需要更新的region句柄,如果lprcUpdate,hrgnUpdate都為空,將更新整個客戶區域
       UINT flags               //重畫選項,如果是NULL,整個指定的區域都將無效
     );
  10. CreateToolhelp32Snapshot
     為指定的進程、進程使用的堆[HEAP]、模塊[MODULE]、線程[THREAD])建立一個快照[snapshot]。
     HANDLE WINAPI CreateToolhelp32Snapshot(
     DWord dwFlags,
     DWord th32ProcessID
     );
     參數:
     dwFlags
     [in]指定快照中包含的系統內容,這個參數能夠使用下列數值(變量)中的一個。
          TH32CS_INHERIT - 聲明快照句柄是可繼承的。
          TH32CS_SNAPALL - 在快照中包含系統中所有的進程和線程。
          TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的進程的所有的堆。
          TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的進程的所有的模塊。
          TH32CS_SNAPPROCESS - 在快照中包含系統中所有的進程。
          TH32CS_SNAPTHREAD - 在快照中包含系統中所有的線程。
     th32ProcessID
     [in]指定將要快照的進程ID。如果該參數為0表示快照當前進程。該參數只有在設置了TH32CS_SNAPHEAPLIST或TH32CS_SNAPMOUDLE後才有效,在其他情況下該參數被忽略,所有的進程都會被快照。
     返回值:
     調用成功,返回快照的句柄,調用失敗,返回INVAID_HANDLE_VALUE。
  11. Process32First
     獲取快照中的第一個進程信息,考核進程信息到lppe中
     BOOL WINAPI Process32First(
       HANDLE hSnapshot,//CreateToolhelp32Snapshot返回的快照
       LPPROCESSENTRY32 lppe //[in,out]進程快照信息結構
     );
     成功返回true,失敗返回false
  12. GetDialogBaseUnits
    函數功能:該函數返回系統的對話基本單位,該基本單位為系統字體字符的平均寬度和高度。對於使用系統字體的對話框,可以用這些值在對話框模板之間轉換,比如在對話框模板和像素之間。對於不使用系統字體的對話框,從對話框模板單位到像素的轉換要根據對話框使用的字體而定。對於對話框的其中一種類型用MaPDialogRect函數很容易地來執行轉換,MaPDialogRect考慮字體且正確的把一個長方形模板單位轉換為此像素。
    函數原型:LONG GetDialogBaseUnits(VOID);
    參數:無。
    返回值:返回值為一個32位的含有對話基本單位的值。返回值的低位字含有水平對話框基本單位,且高低位字含有垂直對話框基本單位。
    備注:GetDialogBaseUnits函數返回的水平基本單位同系統字體中字符以像素為單位的平均寬度相等;垂直基本單位同系統字體中字符的以像素為單位的平均高度相等; 對於一個沒有使用系統字體的對話框基本單位相等於對話框字體字符以像素為單位的平均寬度和平均高度。可以用GetTextMetrics和GetTextExtentPoint32函數為一個選擇的字體來計算這些值。但是,如果計算結果與那些通過系統執行的值不同,那麼可以用MapDialogRect函數避免可能發生的錯誤。每一個水平基本單位同四個水平對話框模板單位相等;每一個垂直基本單位同八個垂直對話框模板單位相等。所以用下列公式來把對話框模板單位轉換為像素:
    PiselX=(temptateunitX*baseunitX)/4;PiseIY=(templateunitY*baseunitY)/8
    同樣地.用下列公式來把像素轉換為對話框模板單位:
    templateunitX=(pixelX*4)/baseunitX;templateunitY=(plxelY*8)/baseunitY
  13. SetWindowPos
    函數功能:該函數改變一個子窗口,彈出式窗口式頂層窗口的尺寸,位置和Z序。子窗口,彈出式窗口,及頂層窗口根據它們在屏幕上出現的順序排序、頂層窗口設置的級別最高,並且被設置為Z序的第一個窗口。
        函數原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT Flags);
        參數:
        hWnd:窗口句柄。
        hWndlnsertAfter:在z序中的位於被置位的窗口前的窗口句柄。該參數必須為一個窗口句柄,或下列值之一:
        HWND_BOTTOM:將窗口置於Z序的底部。如果參數hWnd標識了一個頂層窗口,則窗口失去頂級位置,並且被置在其他窗口的底部。
        HWND_DOTTOPMOST:將窗口置於所有非頂層窗口之上(即在所有頂層窗口之後)。如果窗口已經是非頂層窗口則該標志不起作用。
        HWND_TOP:將窗口置於Z序的頂部。
        HWND_TOPMOST:將窗口置於所有非頂層窗口之上。即使窗口未被激活窗口也將保持頂級位置。
        查g看該參數的使用方法,請看說明部分。
        x:以客戶坐標指定窗口新位置的左邊界。
        Y:以客戶坐標指定窗口新位置的頂邊界。
        cx:以像素指定窗口的新的寬度。
        cy:以像素指定窗口的新的高度。
        uFlags:窗口尺寸和定位的標志。該參數可以是下列值的組合:
        SWP_ASNCWINDOWPOS:如果調用進程不擁有窗口,系統會向擁有窗口的線程發出需求。這就防止調用線程在其他線程處理需求的時候發生死鎖。
        SWP_DEFERERASE:防止產生WM_SYNCPAINT消息。
        SWP_DRAWFRAME:在窗口周圍畫一個邊框(定義在窗口類描述中)。
        SWP_FRAMECHANGED:給窗口發送WM_NCCALCSIZE消息,即使窗口尺寸沒有改變也會發送該消息。如果未指定這個標志,只有在改變了窗口尺寸時才發送WM_NCCALCSIZE。
        SWP_HIDEWINDOW;隱藏窗口。
        SWP_NOACTIVATE:不激活窗口。如果未設置標志,則窗口被激活,並被設置到其他最高級窗口或非最高級組的頂部(根據參數hWndlnsertAfter設置)。
        SWP_NOCOPYBITS:清除客戶區的所有內容。如果未設置該標志,客戶區的有效內容被保存並且在窗口尺寸更新和重定位後拷貝回客戶區。
        SWP_NOMOVE:維持當前位置(忽略X和Y參數)。
        SWP_NOOWNERZORDER:不改變z序中的所有者窗口的位置。
        SWP_NOREDRAW:不重畫改變的內容。如果設置了這個標志,則不發生任何重畫動作。適用於客戶區和非客戶區(包括標題欄和滾動條)和任何由於窗回移動而露出的父窗口的所有部分。如果設置了這個標志,應用程序必須明確地使窗口無效並區重畫窗口的任何部分和父窗口需要重畫的部分。
        SWP_NOREPOSITION;與SWP_NOOWNERZORDER標志相同。
        SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。
        SWP_NOSIZE:維持當前尺寸(忽略cx和Cy參數)。
        SWP_NOZORDER:維持當前Z序(忽略hWndlnsertAfter參數)。
        SWP_SHOWWINDOW:顯示窗口。
        返回值:如果函數成功,返回值為非零;如果函數失敗,返回值為零。若想獲得更多錯誤消息,請調用GetLastError函數。
        備注:如果設置了SWP_SHOWWINDOW和SWP_HIDEWINDOW標志,則窗口不能被移動和改變大。如果使用SetWindowLoog改變了窗口的某些數據,則必須調用函數SetWindowPos來作真正的改變。使用下列的組合標志:SWP_NOMOVEISWP_NOSIZEISWP_FRAMECHANGED。
        有兩種方法將窗口設為最頂層窗口:一種是將參數hWndlnsertAfter設置為HWND_TOPMOST並確保沒有設置SWP_NOZORDER標志;另一種是設置窗口在Z序中的位置以使其在其他存在的窗口之上。當一個窗口被置為最頂層窗口時,屬於它的所有窗口均為最頂層窗口,而它的所有者的z序並不改變。
        如果HWND_TOPMOST和HWND_NOTOPMOST標志均未指定,即應用程序要求窗口在激活的同時改變其在Z序中的位置時,在參數hWndinsertAfter中指定的值只有在下列條件中才使用:
        在hWndlnsertAfter參數中沒有設定HWND_NOTOPMOST和HWND_TOPMOST標志。
        由hWnd參數標識的窗口不是激活窗口。
        如果未將一個非激活窗口設定到z序的頂端,應用程序不能激活該窗口。應用程序可以無任何限制地改變被激活窗口在Z序中的位置,或激活一個窗口並將其移到最高級窗口的頂部或非最高級窗口的頂部。
        如果一個頂層窗口被重定位到z序的底部(HWND_BOTTOM)或在任何非最高序的窗口之後,該窗口就不再是最頂層窗口。當一個最頂層窗口被置為非最頂級,則它的所有者窗口和所屬者窗口均為非最頂層窗口。
        一個非最頂端窗口可以擁有一個最頂端窗口,但反之則不可以。任何屬於頂層窗口的窗口(例如一個對話框)本身就被置為頂層窗口,以確保所有被屬窗口都在它們的所有者之上。
        如果應用程序不在前台,但應該位於前台,就應調用SetForegroundWindow函數來設置。
        當在這個函數中的nFlags參數裡指定了SWP_FRAMECHANGED標志時,WindowsCE重畫窗口的整個非客戶區,這可能會改變客戶區的大小。這也是重新計算客戶區的唯一途徑,也是通過調用SetwindowLong函數改變窗口風格後通常使用的方法。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved