2017-04-26 10 views
0

これで、シンプルなスクリーンショットプログラムを作成しようとしています。スクリーンショットを撮ったときとプログラムを実行するときにBalloonToolTipを表示するプログラムが必要です始めるとき。下のコードは、私のプログラム全体を示しています。フォームもデザイナーもありません。 Program.csから実行される単なるプログラムであり、コンソールアプリケーションではありません。C#非フォームアプリケーションからBalloonToolTipを作成する方法

using System; 
using System.Windows.Forms; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Windows; 
using FullscreenShot.Properties; 
using GlobalHotKey; 
using System.Windows.Input; 
using System.Timers; 
using System.Threading.Tasks; 
using Microsoft.Win32; 

namespace FullscreenShot 
{ 
class Program 
{ 
    private static NotifyIcon notifyIcon; 
    private static HotKeyManager hotKeyManager; 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     System.Windows.Forms.Application.EnableVisualStyles(); 
     System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false); 
     // We need to dispose here, or the icon will not remove until the 
     // system tray is updated. 
     System.Windows.Forms.Application.ApplicationExit += delegate{ notifyIcon.Dispose(); }; 
     CreateNotifyIcon(); 
     System.Windows.Forms.Application.Run(); 
    } 

    /// <summary> 
    /// Creates the icon that sits in the system tray. 
    /// </summary> 

    private static void CreateNotifyIcon() 
    { 
     notifyIcon = new NotifyIcon 
     { 
      Icon = Resources.AppIcon, 
      ContextMenu = GetContextMenu() 
     }; 
     notifyIcon.Visible = true; 
/*------------------------------------------------------------*/ 
     hotKeyManager = new HotKeyManager();//Creates Hotkey manager from GlobalHotKey 

     var hotKey = hotKeyManager.Register(Key.F12, ModifierKeys.Control); // Sets Hotkey to Control + F12, ModifierKeys must be pressed first/ 

     hotKeyManager.KeyPressed += HotKeyManagerPressed; //Creates void for "HotKeyManagerPressed" 

     void HotKeyManagerPressed(object sender, KeyPressedEventArgs e) //Checks to see if hotkey is pressed 
     { 
      if(e.HotKey.Key == Key.F12) 

      { 
       TakeFullScreenShotAsync(); 
       BalloonTip(); 
       // MessageBox.Show("Screenshot Taken"); 
      } 
     } 

    } 

    /// <summary> 
    /// Creates BalloonTip to notify you that your Screenshot was taken. 
    /// </summary> 
    private static void BalloonTip() 
    { 
     notifyIcon.Visible = true; 
     notifyIcon.Icon = SystemIcons.Information; 
     notifyIcon.ShowBalloonTip(740, "Important From Screenshot", "Screenshot Taken", ToolTipIcon.Info); 
    } 

    private static void BalloonTip2() 
    { 
     notifyIcon.Visible = true; 
     notifyIcon.Icon = SystemIcons.Information; 
     notifyIcon.ShowBalloonTip(1, "Important From Screenshot", "Screenshot will now begin on startup", ToolTipIcon.Info); 
    } 

    ///<summary> 
    ///Creates the contextmenu for the Icon 
    ///<summary> 
    private static ContextMenu GetContextMenu() 
    { 
     string myPath = System.AppDomain.CurrentDomain.BaseDirectory.ToString(); 
     System.Diagnostics.Process prc = new System.Diagnostics.Process(); 
     prc.StartInfo.FileName = myPath; 
     ContextMenu menu = new ContextMenu(); 
     menu.MenuItems.Add("Take Screenshot (Ctrl+F12)", delegate { TakeFullScreenShotAsync(); }); 
     menu.MenuItems.Add("Open Folder", delegate { prc.Start(); }); 
     menu.MenuItems.Add("Exit", delegate { System.Windows.Forms.Application.Exit(); }); 
     menu.MenuItems.Add("Run On Startup", delegate { RunOnStartup(); }); 

     return menu; 

    } 

    /// <summary> 
    /// Simple function that finds Registry and adds the Application to the startup 
    /// </summary> 
    private static void RunOnStartup() 
    { 
     RegistryKey reg = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); 
     reg.SetValue("MyApp", Application.ExecutablePath.ToString()); 
     BalloonTip2(); 
     MessageBox.Show("The Program will now start on startup"); 
    } 


    /// <summary> 
    /// Gets points for the screen uses those points to build a bitmap of the screen and saves it. 
    /// </summary> 
    private static async void TakeFullScreenShotAsync() 
    { 
     await Task.Delay(750);//Allows task to be waited on for .75ths of a second. Time In ms. 


     int width = Screen.PrimaryScreen.Bounds.Width; 
     int height = Screen.PrimaryScreen.Bounds.Height; 

     using (Bitmap screenshot = new Bitmap(width, height, PixelFormat.Format32bppArgb)) 
     { 
      using (Graphics graphics = Graphics.FromImage(screenshot)) 
      { 
       System.Drawing.Point origin = new System.Drawing.Point(0, 0); 
       System.Drawing.Size screenSize = Screen.PrimaryScreen.Bounds.Size; 
       //Copy Entire screen to entire bitmap. 
       graphics.CopyFromScreen(origin, origin, screenSize); 
      } 

      //Check to see if the file exists, if it does, append. 
      int append = 1; 

      while (File.Exists($"Screenshot{append}.jpg")) 
       append++; 

      string fileName = $"Screenshot{append}.jpg"; 
      screenshot.Save(fileName, ImageFormat.Jpeg); 
     } 
    } 
} 
} 

今、あなたはすべてのことを必要としないかもしれないが、私は、プロセスに混乱何かをアップしませんでしたし、私の資源が発見されているとアイコンが設定されているはい、私はちょうどいないことを確認したいですなぜこれが機能していないのか理解する。

+1

は、それがスクリーンショットを撮るのか?アプリケーションをデバッグするとき、 'BalloonTip'メソッドでブレークポイントを打つことができますか?そこにコピー/貼り付けの問題があるかどうかはわかりませんが、ネストされたメソッドが許可されているかどうかはわかりません( 'HotKeyManagerPressed'は' CreateNotifyIcon'の中にあります)? –

答えて

1

私はちょっとした問題がありますが、あなたがコピーした貼り付けエラーではないかと思います。あなたはHotKeyManagerPressedを外に保つ必要があります。それは私のために働いた、私はそれがWindows 10の通知の通知を参照してください。

using System; 
using System.Windows.Forms; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Windows; 
using GlobalHotKey; 
using System.Windows.Input; 
using System.Timers; 
using System.Threading.Tasks; 
using Microsoft.Win32; 
using FullScreenShot.Properties; 

namespace FullScreenShot 
{ 
    class Program 
    { 
     private static NotifyIcon notifyIcon; 
     private static HotKeyManager hotKeyManager; 

     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      System.Windows.Forms.Application.EnableVisualStyles(); 
      System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false); 
      // We need to dispose here, or the icon will not remove until the 
      // system tray is updated. 
      System.Windows.Forms.Application.ApplicationExit += delegate { notifyIcon.Dispose(); }; 
      CreateNotifyIcon(); 
      System.Windows.Forms.Application.Run(); 
     } 

     /// <summary> 
     /// Creates the icon that sits in the system tray. 
     /// </summary> 

     private static void CreateNotifyIcon() 
     { 
      notifyIcon = new NotifyIcon 
      { 
       Icon = Resources.AppIcon, 
       ContextMenu = GetContextMenu() 
      }; 
      notifyIcon.Visible = true; 
      /*------------------------------------------------------------*/ 
      hotKeyManager = new HotKeyManager();//Creates Hotkey manager from GlobalHotKey 

      var hotKey = hotKeyManager.Register(Key.F12, ModifierKeys.Control); // Sets Hotkey to Control + F12, ModifierKeys must be pressed first/ 

      hotKeyManager.KeyPressed += HotKeyManagerPressed; //Creates void for "HotKeyManagerPressed" 



    } 
     private static void HotKeyManagerPressed(object sender, KeyPressedEventArgs e) //Checks to see if hotkey is pressed 
     { 
      if (e.HotKey.Key == Key.F12) 

      { 
       TakeFullScreenShotAsync(); 
       BalloonTip(); 
       // MessageBox.Show("Screenshot Taken"); 
      } 
     } 
     /// <summary> 
     /// Creates BalloonTip to notify you that your Screenshot was taken. 
     /// </summary> 
     private static void BalloonTip() 
     { 
      notifyIcon.Visible = true; 
      notifyIcon.Icon = SystemIcons.Information; 
      notifyIcon.ShowBalloonTip(740, "Important From Screenshot", "Screenshot Taken", ToolTipIcon.Info); 
     } 

     private static void BalloonTip2() 
     { 
      notifyIcon.Visible = true; 
      notifyIcon.Icon = SystemIcons.Information; 
      notifyIcon.ShowBalloonTip(1, "Important From Screenshot", "Screenshot will now begin on startup", ToolTipIcon.Info); 
     } 

     ///<summary> 
     ///Creates the contextmenu for the Icon 
     ///<summary> 
     private static ContextMenu GetContextMenu() 
     { 
      string myPath = System.AppDomain.CurrentDomain.BaseDirectory.ToString(); 
      System.Diagnostics.Process prc = new System.Diagnostics.Process(); 
      prc.StartInfo.FileName = myPath; 
      ContextMenu menu = new ContextMenu(); 
      menu.MenuItems.Add("Take Screenshot (Ctrl+F12)", delegate { TakeFullScreenShotAsync(); }); 
      menu.MenuItems.Add("Open Folder", delegate { prc.Start(); }); 
      menu.MenuItems.Add("Exit", delegate { System.Windows.Forms.Application.Exit(); }); 
      menu.MenuItems.Add("Run On Startup", delegate { RunOnStartup(); }); 

      return menu; 

     } 

     /// <summary> 
     /// Simple function that finds Registry and adds the Application to the startup 
     /// </summary> 
     private static void RunOnStartup() 
     { 
      RegistryKey reg = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); 
      reg.SetValue("MyApp", Application.ExecutablePath.ToString()); 
      BalloonTip2(); 
      MessageBox.Show("The Program will now start on startup"); 
     } 


     /// <summary> 
     /// Gets points for the screen uses those points to build a bitmap of the screen and saves it. 
     /// </summary> 
     private static async void TakeFullScreenShotAsync() 
     { 
      await Task.Delay(750);//Allows task to be waited on for .75ths of a second. Time In ms. 


      int width = Screen.PrimaryScreen.Bounds.Width; 
      int height = Screen.PrimaryScreen.Bounds.Height; 

      using (Bitmap screenshot = new Bitmap(width, height, PixelFormat.Format32bppArgb)) 
      { 
       using (Graphics graphics = Graphics.FromImage(screenshot)) 
       { 
        System.Drawing.Point origin = new System.Drawing.Point(0, 0); 
        System.Drawing.Size screenSize = Screen.PrimaryScreen.Bounds.Size; 
        //Copy Entire screen to entire bitmap. 
        graphics.CopyFromScreen(origin, origin, screenSize); 
       } 

       //Check to see if the file exists, if it does, append. 
       int append = 1; 

       while (File.Exists($"Screenshot{append}.jpg")) 
        append++; 

       string fileName = $"Screenshot{append}.jpg"; 
       screenshot.Save(fileName, ImageFormat.Jpeg); 
      } 
     } 
    } 
} 

チェック画像enter image description here

+0

彼らはもはや一緒に入れ子になっていませんが、Balloontipはまだ動作しません。また、Win10 64ビットシステムでも動作します。その他の提案 –

+0

私が気づいたもう1つのことは、あなたがTakeFullScreenShotAsyncを待っていないことです。 – Krishna

0

あなたはTakeFullScreenShotAsync()メソッドでBalloonTip()メソッドを呼び出していません。

private static async void TakeFullScreenShotAsync() 
    { 
     await Task.Delay(750);//Allows task to be waited on for .75ths of a second. Time In ms. 


     int width = Screen.PrimaryScreen.Bounds.Width; 
     int height = Screen.PrimaryScreen.Bounds.Height; 

     using (Bitmap screenshot = new Bitmap(width, height, PixelFormat.Format32bppArgb)) 
     { 
      using (Graphics graphics = Graphics.FromImage(screenshot)) 
      { 
       System.Drawing.Point origin = new System.Drawing.Point(0, 0); 
       System.Drawing.Size screenSize = Screen.PrimaryScreen.Bounds.Size; 
       //Copy Entire screen to entire bitmap. 
       graphics.CopyFromScreen(origin, origin, screenSize); 
      } 

      //Check to see if the file exists, if it does, append. 
      int append = 1; 

      while (File.Exists($"Screenshot{append}.jpg")) 
       append++; 

      string fileName = $"Screenshot{append}.jpg"; 
      screenshot.Save(fileName, ImageFormat.Jpeg); 

      // Call the Show Tip Message Here... 
      BalloonTip(); 
     } 
    } 

ライン:私はすでに、私は私のために働いた何か他のものに変更し、したがってホットキーを登録しているので、hotKeyManager.Register(...)がエラーを投げました。

+0

BalloonTip()を呼び出す必要はありません。ホットキーを使用したときに私はそれを呼び出したので非同期で機能するCtrl + F12 –

関連する問題