Почему при установке окна дескриптора в фокусе оно работает только в первый раз? - PullRequest
0 голосов
/ 21 сентября 2018

Вот как я получаю окна, когда они свернуты:

    private static bool EnumWindowsCallback(IntPtr hWnd, IntPtr lParam)
    {
        bool specialCapturing = false;

        if (hWnd == IntPtr.Zero) return false;

        if (!IsWindowVisible(hWnd)) return true;

        if (!countMinimizedWindows)
        {
            if (IsIconic(hWnd)) return true;
        }
        else if (IsIconic(hWnd) && useSpecialCapturing) specialCapturing = true;

        if (GetWindowText(hWnd) == PROGRAMMANAGER) return true;

        if (GetWindowText(hWnd).Contains("Test"))
            windowSnaps.Add(new WindowSnap(hWnd, specialCapturing));

        return true;
    }

    /// <summary>
    /// Get the collection of WindowSnap instances fro all available windows
    /// </summary>
    /// <param name="minimized">Capture a window even it's Minimized</param>
    /// <param name="specialCapturring">use special capturing method to capture minmized windows</param>
    /// <returns>return collections of WindowSnap instances</returns>
    public static WindowSnapCollection GetAllWindows(bool minimized, bool specialCapturring)
    {
        windowSnaps = new WindowSnapCollection();
        countMinimizedWindows = minimized;//set minimized flag capture
        useSpecialCapturing = specialCapturring;//set specialcapturing flag
        EnumWindowsCallbackHandler callback = new EnumWindowsCallbackHandler(EnumWindowsCallback);
        EnumWindows(callback, IntPtr.Zero);

        return new WindowSnapCollection(windowSnaps.ToArray(), true);
    }

В итоге у меня в windowSnaps например два элемента двух окон приложений с именем Test.

Затем в Form1 я перенесу выбранное окно в listBoxSnap и сфокусирую его:

В Form1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace MinimizeCapture
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        static extern bool SetForegroundWindow(IntPtr hWnd);

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonSnap_Click(object sender, EventArgs e)
        {
            this.listBoxSnap.Items.Clear();
            this.pictureBoxSnap.Image = null;
            this.listBoxSnap.Items.AddRange
                (
            WindowSnap.GetAllWindows(this.checkBoxMinimized.Checked, this.checkBoxSpecialMode.Checked).ToArray()
                );
        }

        private void listBoxSnap_SelectedIndexChanged(object sender, EventArgs e)
        {
            WindowSnap snap = this.listBoxSnap.SelectedItem as WindowSnap;
            this.pictureBoxSnap.Image = snap.Image;
            SetForegroundWindow(snap.Handle);

        }
   }
}

Проблема заключается в том, что в первый раз, когда я выбираю дескриптор окнав listBoxSnap он работает нормально, он переносит выбранный дескриптор окна на передний план и фокусирует его.

Но затем, когда я пытаюсь выбрать другой дескриптор окна в listBox, он ничего не делает, он не переносит его наспереди и не фокусируясь снова.

Я использую:

SetForegroundWindow(snap.Handle);

Таким образом, он переносит два окна вперед и фокусируется на них при выборе, но только один раз в первый раз,Если я хочу сделать это снова, мне нужно закрыть программу csharp и запустить ее снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...