Betriebssystem: Windows Server 2008 R2
Integrierte Entwicklungsumgebung (IDE): Microsoft Visual Studio 2010
Entwicklungssprache: c#
Datei》Neu》Projekt
.NET Framework kann Version 2.0 oder Version 4.0 wählen;
Projekttypauswahl: Windows Forms-Anwendung
Geben Sie den Projektnamen ein und bestätigen Sie
Das Projekt wurde erfolgreich erstellt, wie unten gezeigt:
Ändern Setzen Sie die Eigenschaft „FormBorderStyle“ des Formulars auf „none“, um ein randloses Formular zu implementieren
Nach der Änderung zeigt der Fensterdesigner Folgendes an:
Ändern Sie andere -Attribute der Reihe nach, wie unten gezeigt, die Attributwerte sind in Fettschrift Es handelt sich um eine modifizierte
Attributbeschreibung:
ShowIcon=False, das Symbol des Formulars wird nicht angezeigt ;
ShowInTaskbar=False, damit das Formular nicht in der Windows-Taskleiste angezeigt wird;
SizeGripStyle=Ausblenden, Funktion zum Ändern der Größe durch Ziehen der unteren rechten Ecke des Formulars deaktivieren;
WindowsState=Minimized, Fenster nach dem Start minimieren
Nachdem Sie diese Eigenschaften festgelegt, kompiliert und ausgeführt haben, befindet sich das Programm im ausgeführten Zustand, das Programmfenster kann jedoch nicht sichtbar sein;
hier müssen Sie die WindowsAPI
verwenden, um den Hotkey zu registrieren: RegisterHotKey
DieFunktion definiert einen systemweiten Hotkey . Funktion Prototyp: BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk);
Hotkey-Registrierung abbrechen: UnregisterHotKey
Diese Funktion gibt den Hotkey frei, der zuvor vom aufrufenden Thread registriert wurde.
Hotkey-ID abrufen: GlobalAddAtom
Nur für Desktop-Anwendungen.
Fügt einen String zur globalen Atomtabelle hinzu und gibt die eindeutige Kennung dieses Strings (das Atom-ATOM) zurück.
/// <summary> /// 向全局原子表添加一个字符串,并返回这个字符串的唯一标识符(原子ATOM)。 /// </summary> /// <param name="lpString">自己设定的一个字符串</param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("Kernel32.dll")] public static extern Int32 GlobalAddAtom(string lpString); /// <summary> /// 注册热键 /// </summary> /// <param name="hWnd"></param> /// <param name="id"></param> /// <param name="fsModifiers"></param> /// <param name="vk"></param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk); /// <summary> /// 取消热键注册 /// </summary> /// <param name="hWnd"></param> /// <param name="id"></param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool UnregisterHotKey(IntPtr hWnd, int id); /// <summary> /// 热键ID /// </summary> public int hotKeyId = 100; /// <summary> /// 热键模式:0=Ctrl + Alt + A, 1=Ctrl + Shift + A /// </summary> public int HotKeyMode = 1; /// <summary> /// 控制键的类型 /// </summary> public enum KeyModifiers : uint { None = 0, Alt = 1, Control = 2, Shift = 4, Windows = 8 } /// <summary> /// 用于保存截取的整个屏幕的图片 /// </summary> protected Bitmap screenImage;
private void Form1_Load(object sender, EventArgs e) { //隐藏窗口 this.Hide(); //注册快捷键 //注:HotKeyId的合法取之范围是0x0000到0xBFFF之间,GlobalAddAtom函数得到的值在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。 this.hotKeyId = GlobalAddAtom("Screenshot") - 0xC000; if (this.hotKeyId == 0) { //如果获取失败,设定一个默认值; this.hotKeyId = 0xBFFE; } if (this.HotKeyMode == 0) { RegisterHotKey(Handle, hotKeyId, (uint)KeyModifiers.Control | (uint)KeyModifiers.Alt, Keys.A); } else { RegisterHotKey(Handle, hotKeyId, (uint)KeyModifiers.Control | (uint)KeyModifiers.Shift, Keys.A); } }
/// <summary> /// 处理快捷键事件 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { //if (m.Msg == 0x0014) //{ // return; // 禁掉清除背景消息 //} const int WM_HOTKEY = 0x0312; switch (m.Msg) { case WM_HOTKEY: ShowForm(); break; default: break; } base.WndProc(ref m); }
Das Screenshot-Fenster ist eigentlich ein Vollbildfenster der obersten Ebene ohne Rahmen, ohne Menüs und ohne Symbolleisten.
Wenn der Hotkey gedrückt wird, erhält das Programm zunächst ein Bild des gesamten Bildschirms und speichert es in der Variablen „screenImage“. Anschließend fügt es eine Maskenebene hinzu, legt diese als Hintergrundbild des Formulars fest und legt fest Die Fenstergröße auf Die Größe des Hauptbildschirms und des Anzeigefensters vermittelt das Gefühl, dem Desktop eine durchscheinende Maskenebene hinzuzufügen.
Der Code lautet wie folgt:
/// <summary> /// 如果窗口为可见状态,则隐藏窗口; /// 否则则显示窗口 /// </summary> protected void ShowForm() { if (this.Visible) { this.Hide(); } else { Bitmap bkImage = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height); Graphics g = Graphics.FromImage(bkImage); g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size, CopyPixelOperation.SourceCopy); screenImage = (Bitmap)bkImage.Clone(); g.FillRectangle(new SolidBrush(Color.FromArgb(64, Color.Gray)), Screen.PrimaryScreen.Bounds); this.BackgroundImage = bkImage; this.ShowInTaskbar = false; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Width = Screen.PrimaryScreen.Bounds.Width; this.Height = Screen.PrimaryScreen.Bounds.Height; this.Location = Screen.PrimaryScreen.Bounds.Location; this.WindowState = FormWindowState.Maximized; this.Show(); } }
Wenn Sie das Fenster schließen, lautet der Code zum Abbrechen der Hotkey-Registrierung wie folgt:
/// <summary> /// 当窗口正在关闭时进行验证 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.ApplicationExitCall) { e.Cancel = false; UnregisterHotKey(this.Handle, hotKeyId); } else { this.Hide(); e.Cancel = true; } }
Zu diesem Zeitpunkt sind die Hotkey-Registrierung, die Anzeige des Screenshot-Fensters und andere Funktionen im Wesentlichen abgeschlossen.
Hinweis: Beim Testen dieses Codes ist es am besten, dem Formular eine -Schaltfläche hinzuzufügen, um das Screenshot-Fenster zu schließen oder auszublenden, da das Screenshot-Fenster im Vollbildmodus angezeigt wird und nicht reagieren kann auf die ESC-Taste, so dass der Vorgang nur über den Taskmanager Beenden beendet werden kann. Beim Debuggen ist es am besten, dem Formular ein LabelSteuerelement hinzuzufügen, um die erforderlichen Variableninformationen anzuzeigen, da es sich bei dem Screenshot-Fenster um ein Vollbildfenster der obersten Ebene handelt und dies nicht der Fall ist Art und Weise, es zu bedienen, wenn der Haltepunkt erreicht wird.
Das obige ist der detaillierte Inhalt vonC#-Entwicklungsbeispiel – angepasstes Screenshot-Tool (2) Erstellen Sie ein Projekt, registrieren Sie Hotkeys und zeigen Sie das Screenshot-Hauptfenster an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!