背景:
阅读新闻

使用 Win32 API 來進行控制其他程式視窗行為表現

  作者: 今日评论: [字体: ]

昨天晚上,看到 瓶水相逢.NET  跟 Network Programming in .NET with C# & Visual Basic .NET(VB.NET) 上的技術文章,
於是就找個主題來實作一下,
到了今天早上還到 宅之力 來參考一些技術文章,
想說用用 P/Invoke 的功能,
來呼叫 Win32 API  的一些功能,
後就就找了 ShowWindow(...)、FindWindow(...)、SendMessage(...) 等,
來好好做個使用範例,
本文比較著墨在 ShowWindow(...) 上的用法,
所以在其參數上的說明會比較多~~~
這個用法主要是在於用本程式去「控制其他程式視窗行為表現」方面,
例如:視窗的放大、縮小、隱藏...等。
最後,我提供一個自己製作的範例使用檔 ( 含原始碼 ) 給大家參考。
而本程式是先暫時以控制 Notepad ( 記事本 ) 為範例~
再請大家多多參考囉~~~


※ 本程式能完成,感謝上述所提及的網站的技術文件的提供參考,本人亦有在原程式碼中註明。
※ 同樣的,如果您有使用參考到本程式的地方,本人也是非常的歡迎您參考使用,但是請您載明出處及作者 ,謝謝。
 

範例程式下載網址: http://www.blueshop.com.tw/download/show.asp?pgmcde=PGM20090105152622ILG&extcde=PGMDEFNEW
 

========================
   以 下 為 範 例 程 式 介 面
========================

image

 

========================
以 下 為 程 式 碼 內 容
========================

  1. //-----------------------------------------   
  2. // 本範例程式目前有三大功能~   
  3. // 1. 控制 記事本 (notepad.exe) 的視窗變化  ==> ShowWindow(...)   
  4. // 2. 找尋特定視窗 ==> FindWindow(...)   
  5. // 3. 送出指令給特定視窗,如關閉視窗  ==> SendMessage(...)   
  6. //   
  7. //   
  8. // *程式設計: NobelHsieh ( Nobel12, 軋延油 ) http://www.wretch.cc/blog/nobel12   
  9. // *本程式可提供教學上之無償使用,但相關使用請符合智慧財產之規定,請註明本人原作者及出處即可~   
  10. //   
  11. //-----------------------------------------   
  12.   
  13. using System;   
  14. using System.Collections.Generic;   
  15. using System.ComponentModel;   
  16. using System.Data;   
  17. using System.Drawing;   
  18. using System.Text;   
  19. using System.Windows.Forms;   
  20. using System.Runtime.InteropServices;   
  21. using System.Diagnostics;   
  22.   
  23. namespace FrmControlExternalAPByShowWindows   
  24. {   
  25.     public partial class FrmDemoShowWindows : Form   
  26.     {   
  27.         public FrmDemoShowWindows()   
  28.         {   
  29.             InitializeComponent();   
  30.         }   
  31.   
  32.           
  33.         /// <summary>   
  34.         /// This is a External AP Control Method   
  35.         /// </summary>   
  36.         /// <param name="hwnd">The handle of the window to change the show status of. </param>   
  37.         /// <param name="nCmdShow">Exactly one of the following flags specifying how to show the window: </param>   
  38.         ///SW_HIDE = 0   
  39.         ///Hide the window.   
  40.         ///SW_MAXIMIZE = 3   
  41.         ///Maximize the window.   
  42.         ///SW_MINIMIZE = 6   
  43.         ///Minimize the window.   
  44.         ///SW_RESTORE = 9   
  45.         ///Restore the window (not maximized nor minimized).   
  46.         ///SW_SHOW = 5   
  47.         ///Show the window.   
  48.         ///SW_SHOWMAXIMIZED = 3   
  49.         ///Show the window maximized.   
  50.         ///SW_SHOWMINIMIZED = 2   
  51.         ///Show the window minimized.   
  52.         ///SW_SHOWMINNOACTIVE = 7   
  53.         ///Show the window minimized but do not activate it.   
  54.         ///SW_SHOWNA = 8   
  55.         ///Show the window in its current state but do not activate it.   
  56.         ///SW_SHOWNOACTIVATE = 4   
  57.         ///Show the window in its most recent size and position but do not activate it.   
  58.         ///SW_SHOWNORMAL = 1   
  59.         ///Show the window and activate it (as usual).   
  60.         ///   
  61.         /// Reference Web: 1. http://www.dotblogs.com.tw/chhuang/archive/2008/03/18/1812.aspx   
  62.         /// Reference Web: 2. http://www.webtropy.com/articles/art9-1.asp?f=ShowWindow   
  63.         /// <returns></returns>   
  64.           
  65.         [DllImport("user32")]   
  66.         public static extern int ShowWindow(int hwnd, int nCmdShow);   
  67.           
  68.         // 以下是為了給 nCmdShow 參數相對應的代碼意思   
  69.         private enum CommandShow : int  
  70.         {   
  71.             SW_HIDE = 0,   
  72.             SW_SHOWNORMAL = 1,   
  73.             SW_NORMAL = 1,   
  74.             SW_SHOWMINIMIZED = 2,   
  75.             SW_SHOWMAXIMIZED = 3,   
  76.             SW_MAXIMIZE = 3,   
  77.             SW_SHOWNOACTIVATE = 4,   
  78.             SW_SHOW = 5,   
  79.             SW_MINIMIZE = 6,   
  80.             SW_SHOWMINNOACTIVE = 7,   
  81.             SW_SHOWNA = 8,   
  82.             SW_RESTORE = 9,   
  83.             SW_SHOWDEFAULT = 10,   
  84.             SW_FORCEMINIMIZE = 11,   
  85.               
  86.         }   
  87.   
  88.         //--------------------------------------------------------   
  89.   
  90.         /// <summary>   
  91.         ///  1. FindWindow --> FindWindow searches all windows for one which matches the window class name and/or window name. The function's searching mechanism is not case-sensitive. If you do not wish to specify one of the parameters, pass a null string for it.   
  92.         ///  Return Value: If successful, the function returns a handle to the window that was found. If no matching window could be found, or if an error occured, the function returns zero (use GetLastError to get the error code).   
  93.         ///    
  94.         /// </summary>   
  95.         /// <param name="strclassName">The name of the window class of the window to find. To ignore the window's class, specify a null string. </param>   
  96.         /// <param name="strWindowName">The name of the title bar text of the window to find. To ignore the window's text, specify a null string. </param>   
  97.         /// Reference Web: http://blog.wahahajk.com/2008/11/c.html   
  98.         /// <returns></returns>   
  99.   
  100.         [DllImport("user32.dll")]   
  101.         public static extern int FindWindow(string strclassName, string strWindowName);   
  102.   
  103.   
  104.         /// <summary>   
  105.         /// 2. SendMessage --> SendMessage sends a message to a window. Specifically, the function calls that window's procedure to handle to message. This function does not return until the window has completed processing the message. SendMessage Sends the specified message to a window or windows. Any of the following:System.Windows.Forms.Control.DefWndProcSystem.Windows.Forms.Control.WndProcSystem.Windows.Forms.Form.DefWndProcSystem.Windows.Forms.Form.WndProc Alphabetical Win32 Category ListHierarchical Win32 Category List Metafile Functions Win32 function Description .NET Framework API   
  106.         ///   
  107.         /// </summary>   
  108.         /// <param name="hWnd">A handle to the window to send the message to. If this is HWND_BROADCAST, the message is sent to all open top-level windows. </param>   
  109.         /// <param name="Msg">The identifier of the message to send. </param>   
  110.         /// <param name="wParam">Additional message-specific data. </param>   
  111.         /// <param name="lParam">Additional message-specific data. </param>   
  112.         /// Const HWND_BROADCAST = &HFFFF   
  113.         /// Reference Web: http://blog.wahahajk.com/2008/11/c.html   
  114.         /// <returns></returns>   
  115.         ///   
  116.   
  117.         [DllImport("user32.dll")]   
  118.         private static extern int SendMessage(   
  119.                int hWnd,   // handle to destination window   
  120.                int Msg,    // message   
  121.                int wParam,   // first message parameter   
  122.                int lParam     // second message parameter   
  123.          );   
  124.         const int WM_KEYDOWN = 0x0100;   
  125.         const int WM_KEYUP = 0x0101;   
  126.         const int WM_SYSCOMMAND = 0x0112;   
  127.         const int SC_CLOSE = 0xF060;   
  128.   
  129.     
  130.   
  131.         //--------------------------------------------------------   
  132.   
  133.   
  134.         int hwnd;   
  135.         int temp_hwnd;   
  136.         private void TriggerAction(int InputValue)   
  137.         {   
  138.             // 取得欲控制程式的名稱   
  139.             Process[] p = Process.GetProcessesByName("notepad");   
  140.               
  141.             // 判斷是否為長度大於 0   
  142.             if (p.Length > 0)   
  143.             {   
  144.                 hwnd = p[0].MainWindowHandle.ToInt32();   
  145.                 switch (InputValue)   
  146.                 {   
  147.                 case 0:   
  148.                     temp_hwnd = hwnd;   
  149.                     ShowWindow(hwnd, (int)CommandShow.SW_HIDE);   
  150.                  break;   
  151.                 case 1:   
  152.                     hwnd = HaveBeenHiden(hwnd);   
  153.                     ShowWindow(hwnd, (int)CommandShow.SW_SHOWNORMAL);   
  154.                     break;   
  155.                 case 101:   
  156.                     hwnd = HaveBeenHiden(hwnd);   
  157.                     ShowWindow(hwnd, (int)CommandShow.SW_NORMAL);   
  158.                     break;   
  159.                 case 2:   
  160.                     hwnd = HaveBeenHiden(hwnd);   
  161.                     ShowWindow(hwnd, (int)CommandShow.SW_SHOWMINIMIZED);   
  162.                     break;   
  163.                 case 3:   
  164.                     hwnd = HaveBeenHiden(hwnd);   
  165.                     ShowWindow(hwnd, (int)CommandShow.SW_SHOWMAXIMIZED);   
  166.                     break;   
  167.                 case 303:   
  168.                     hwnd = HaveBeenHiden(hwnd);   
  169.                     ShowWindow(hwnd, (int)CommandShow.SW_MAXIMIZE);   
  170.                     break;   
  171.                 case 4:   
  172.                     hwnd = HaveBeenHiden(hwnd);   
  173.                     ShowWindow(hwnd, (int)CommandShow.SW_SHOWNOACTIVATE);   
  174.                     break;   
  175.                 case 5:   
  176.                     hwnd = HaveBeenHiden(hwnd);   
  177.                     ShowWindow(hwnd, (int)CommandShow.SW_SHOW);   
  178.                     break;   
  179.                 case 6:   
  180.                     hwnd = HaveBeenHiden(hwnd);   
  181.                     ShowWindow(hwnd, (int)CommandShow.SW_MINIMIZE);   
  182.                     break;   
  183.                 case 7:   
  184.                     hwnd = HaveBeenHiden(hwnd);   
  185.                     ShowWindow(hwnd, (int)CommandShow.SW_SHOWMINNOACTIVE);   
  186.                     break;   
  187.                 case 8:   
  188.                     hwnd = HaveBeenHiden(hwnd);   
  189.                     ShowWindow(hwnd, (int)CommandShow.SW_SHOWNA);   
  190.                     break;   
  191.                 case 9:   
  192.                     hwnd = HaveBeenHiden(hwnd);   
  193.                     ShowWindow(hwnd, (int)CommandShow.SW_RESTORE);   
  194.                     break;   
  195.                 case 10:   
  196.                     hwnd = HaveBeenHiden(hwnd);   
  197.                     ShowWindow(hwnd, (int)CommandShow.SW_SHOWDEFAULT);   
  198.                     break;   
  199.                 case 11:   
  200.                     hwnd = HaveBeenHiden(hwnd);   
  201.                     ShowWindow(hwnd, (int)CommandShow.SW_FORCEMINIMIZE);   
  202.                     break;   
  203.   
  204.                 case 9998:   
  205.                     hwnd = HaveBeenHiden(hwnd);   
  206.                     ShowWindow(hwnd, (int)CommandShow.SW_SHOWNORMAL);   
  207.   
  208.                     notifyIcon1.Visible = false;   
  209.                     timer1.Stop();   
  210.   
  211.                     btnZoomSys.Enabled = true;   
  212.                     btnReState.Enabled = false;   
  213.                     break;   
  214.   
  215.                 case 9999:   
  216.                     temp_hwnd = hwnd;   
  217.                     hwnd = HaveBeenHiden(hwnd);   
  218.                     ShowWindow(hwnd, (int)CommandShow.SW_HIDE);   
  219.   
  220.                       
  221.                     notifyIcon1.Text = "這是示範的小圖示";   
  222.                     notifyIcon1.BalloonTipTitle = "沒啥好特別的~~~";   
  223.                     notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;   
  224.                     notifyIcon1.Icon = new Icon("folder.ico");   
  225.                     notifyIcon1.Visible = true;   
  226.   
  227.                       
  228.                     timer1.Interval = 1000;   
  229.                     timer1.Enabled = true;   
  230.                     timer1.Start();   
  231.   
  232.                     btnReState.Enabled = true;   
  233.                     btnZoomSys.Enabled = false;   
  234.   
  235.                     break;   
  236.                 }   
  237.                   
  238.             }   
  239.         }   
  240.   
  241.         private int HaveBeenHiden(int hwnd)   
  242.         {   
  243.             if (hwnd == 0)   
  244.             {   
  245.                 hwnd = temp_hwnd;   
  246.             }   
  247.             return hwnd;   
  248.         }   
  249.   
  250.   
  251.         private void btnHide_Click(object sender, EventArgs e)   
  252.         {   
  253.             TriggerAction(0);   
  254.         }   
  255.   
  256.         private void btnShowNormal_Click(object sender, EventArgs e)   
  257.         {   
  258.             TriggerAction(1);   
  259.         }   
  260.   
  261.         private void btnNormal_Click(object sender, EventArgs e)   
  262.         {   
  263.             TriggerAction(101);   
  264.         }  
来源:http://www.dotblogs.com.tw/nobel12/archive/2009/10/05/10915.aspx
录入日期:[2009/10/12 8:26:00]
收藏 推荐 打印 | 录入:mikebai | 阅读:
文章评论      
正在加载评论列表...
评论表单加载中...