冰楓論壇

 找回密碼
 立即註冊
ads_sugarbook
搜索
查看: 1766|回覆: 0
打印 上一主題 下一主題

[心得] [C#] 透過行程名稱/行程ID操作程式程式

[複製鏈接]

622

主題

0

好友

766

積分

高級贊助會員

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

UID
390967
帖子
1189
主題
622
精華
0
積分
766
楓幣
6933
威望
309
存款
4100
贊助金額
1800
推廣
0
GP
1628
閱讀權限
150
在線時間
142 小時
註冊時間
2023-5-18
最後登入
2024-4-30

2023年紀念勳章 太陽勳章 神手勳章 高級客戶 VIP會員 私服達人 懶人勳章 幼兒勳章 音樂勳章 屁孩勳章 貢獻王 性別(女) 性別(男) 積分勳章 發帖達人 2023端午節紀念勳章 富豪勳章 富可敵國 2023中秋節紀念勳章 解說達人 論壇粉絲 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-6-2 21:00:07 |只看該作者 |倒序瀏覽
判斷程式是否執行
  1. public bool IsWindowExist(IntPtr handle)
  2. {
  3.     return (!(GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero) && IsWindowVisible(new HandleRef(this, handle)));
  4. }

  5. [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
  6. public static extern IntPtr GetWindow(HandleRef hWnd, int uCmd);

  7. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  8. public static extern bool IsWindowVisible(HandleRef hWnd);
複製代碼
根據處理緒Handle查找程式
  1. public IntPtr GetWindowHandle(int processId)
  2. {
  3.     var windowHandle = IntPtr.Zero;
  4.     EnumThreadwindowsCallback windowsCallback = new EnumThreadWindowsCallback(FindMainWindow);
  5.     EnumWindows(windowsCallback, IntPtr.Zero);

  6.     GC.KeepAlive(windowsCallback);

  7.     bool FindMainWindow(IntPtr handle, IntPtr extraParameter)
  8.     {
  9.         int num;
  10.         GetWindowThreadProcessId(new HandleRef(this, handle), out num);
  11.         if (num == processId && IsWindowExist(handle))
  12.         {
  13.             windowHandle = handle;
  14.             return true;
  15.         }
  16.         return false;
  17.     }

  18.     return windowHandle;
  19. }

  20. public delegate bool EnumThreadWindowsCallback(IntPtr hWnd, IntPtr lParam);

  21. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  22. public static extern bool EnumWindows(EnumThreadWindowsCallback callback, IntPtr extraData);

  23. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  24. public static extern int GetWindowThreadProcessId(HandleRef handle, out int processId);
複製代碼
根據行程ID關閉程式
  1. public void CloseWindow(int processId)
  2. {
  3.     var mwh = GetWindowHandle(processId);
  4.     SendMessage(mwh, MW_CLOSE, 0, 0);
  5. }
  6. const int MW_CLOSE = 0x0010;

  7. [DllImport("User32.dll", EntryPoint = "SendMessage")]
  8. public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
複製代碼
關閉所有此行程名稱的程式
  1. public void CloseAllWindows(string processName)
  2. {
  3.     Process[] processList = Process.GetProcessesByName(processName);
  4.     foreach (Process process in processList)
  5.     {
  6.         CloseMainWindow(process.Id);
  7.     }
  8. }
複製代碼
直接關閉所有行程
  1. public static bool CloseAllProcesses(string processName)
  2. {
  3.     try
  4.     {
  5.         Process[] psEaiNotes = Process.GetProcessesByName(processName);
  6.         foreach (Process psEaiNote in psEaiNotes)
  7.         {
  8.             psEaiNote.Kill();
  9.         }
  10.     }
  11.     catch
  12.     {
  13.         return false;
  14.     }
  15.     return true;
  16. }
複製代碼
重新啟動程序
  1. string appFileName = currentClientProcess.MainModule.FileName;

  2. Process newClient = new Process();
  3. newClient.StartInfo.FileName = appFileName;
  4. // 設定執行程序的開始目錄
  5. newClient.StartInfo.WorkingDirectory = System.Windows.Forms.Application.ExecutablePath;

  6. // 執行程序
  7. currentClientProcess.Kill();
  8. newClient.Start();
複製代碼
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1骰子
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們職位招聘本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-5-1 06:54

回頂部