C # вернуть фокус к предыдущему окну - PullRequest
0 голосов
/ 01 марта 2012

Мне нужно вернуться к окну переднего плана, которое было активным до моего окна приложения, я пытался использовать user32.dll для этого, но я не могу найти предыдущее окно hendle.

   [DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern int GetWindowText(IntPtr hWnd, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpString, int nMaxCount);

    [DllImport("user32", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
    public static extern IntPtr GetWindow(IntPtr hwnd, uint wFlag);

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr GetFocus();

    [DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    public static extern IntPtr SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern bool PostMessage(IntPtr hWnd, int Msg, char wParam, int lParam);

    [DllImport("user32")]
    public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

    [DllImport("user32")]
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern uint GetCurrentThreadId();
     ...
        hMe = GetForegroundWindow();
        hNext = GetNextWindow(hMe, hw_next);
        System.Text.StringBuilder window = new StringBuilder(32);
        GetWindowText(hNext, window, 32);

и я получаю только «IME по умолчанию» или «M» в следующем окне, как я могу найти окно реального приложения?

Я сделал цикл через окна, чтобы найти свой блокнотокно:

0: D:\univer\C#
1: 
2: 
3: 
4: 
5: 
6: Главное меню
7: 
8: 
9: M
10: Default IME
11: 
12: 
13: 
14: CiceroUIWndFrame
15: 
16: 
17: 
18: SysFader
19: SysFader
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: SysFader
36: 
37: 
38: HDMI Settings
39: S/PDIF IN/OUT Settings
40: Set Device Type
41: Mixer ToolBox
42: Параметры разъёма
43: CiceroUIWndFrame
44: TF_FloatingLangBar_WndTitle
45: Syn Zoom Window
46: Syn Visual Window
47: 
48: 
49: Начать отладку (F5)
50: M
51: Default IME
52: 
53: 
54: 
55: 
56: 
57: 
58: *new  2 - Notepad++

У меня есть решение с помощью Hook:

    delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);

    [DllImport("user32.dll")]
    static extern bool UnhookWinEvent(IntPtr hWinEventHook);

    [DllImport("user32.dll")]
    static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags);


 private static void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
    {
        uint id = 0;
        if (eventType == EVENT_SYSTEM_FOREGROUND)
        {
            if (hwnd != _this.hKeyboard && hwnd != _this.hLast && hwnd != IntPtr.Zero)
            {
                _this.hLast = hwnd;

            }
        }
    }
 ...
 Form1_load(){
    _WinEvent = new WinEventDelegate(WinEventProc);
    mHook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, _WinEvent, 0, 0, WINEVENT_OUTOFCONTEXT);
 }

1 Ответ

2 голосов
/ 01 марта 2012

Z-порядок окон не имеет прямого отношения к тому, когда они были активированы или переключены в / из. Правильный способ получить hWnd ранее активного окна - обработать сообщение WM_ACTIVATE. Предыдущий hWnd будет передан в значении lParam.

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