Использование WM_SHOWWINDOW для показа окна вместо ShowWindow () - PullRequest
3 голосов
/ 03 сентября 2010

Я пытаюсь использовать функцию SendMessage утилиты горячих клавиш (или NirCMD и т. Д.), Чтобы открыть скрытое окно. Например, я могу закрыть окна, отправив 0x0010 (WM_CLOSE), но когда я пытаюсь отправить 0x0018 (WM_SHOWWINDOW) с wParam, равным 1, и lParam, равным 0, ничего не происходит.

Я осмотрелся, и в тех немногих местах, где кто-то жаловался на то, что WM_SHOWWINDOW не работает, они с радостью приняли предложение использовать ShowWindow () вместо этого.

Однако у меня нет ShowWindow (); Я могу только отправлять сообщения Windows. Но ShowWindow () не волшебство, конечно, он работает путем отправки сообщения WM_SHOWWINDOW или чего-то еще под одеялом.

Как я могу получить окно для отображения себя, отправив ему сообщение?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 03 сентября 2010

Попробуйте эти два сообщения:

SendMessage(h,WM_SYSCOMMAND,SC_MINIMIZE,0);
SendMessage(h,WM_SYSCOMMAND,SC_RESTORE,0);

Или, если вы используете сторонние приложения, попробуйте cmdow

2 голосов
/ 03 сентября 2010

WM_SHOWWINDOW - это уведомление, а не команда.Из MSDN:

Сообщение WM_SHOWWINDOW отправляется окну, когда окно собирается быть скрытым или показанным.

Я не верю, что есть какое-либо сообщение, котороеВы можете использовать, чтобы окно показывало себя.На самом деле, сама идея кажется мне немного странной.Менеджер окон - это системный компонент, отвечающий за отображение и скрытие окон.Чтобы показать окно, вы должны использовать один из API оконного менеджера.

0 голосов
/ 20 мая 2014

Я думаю, что нет способа достичь этого с помощью SendMessage (WM_SYSCOMMAND не работает для меня). Я пытался на самом деле в C #. Вы нажимаете кнопку, окно будет свернуто с помощью ShowWindow(), а затем вы сможете увидеть, какие сообщения отправлены:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class Form1: Form
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool ShowWindow(IntPtr window, int showCommand);

        private const int SW_MINIMIZE = 6;
        private bool print = false;

        public Form1()
        {
            Button button = new Button();
            button.Click += onButtonsClick;
            Controls.Add(button);
        }

        private void onButtonsClick(object sender, EventArgs e)
        {
            print = true;
            ShowWindow(Handle, SW_MINIMIZE);
            print = false;
        }

        protected override void WndProc(ref Message m)
        {
            if (print)
                Console.WriteLine(m.Msg.ToString() + "\t0x" + m.Msg.ToString("x4") + "\t" + m.WParam + "\t" + m.LParam);
            base.WndProc(ref m);
        }
    }
}   
...