2010-09-02 4 views
3

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

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

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

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

Спасибо.

+0

Почему не ShowWindow() доступен? Если вы можете позвонить SendMessage(), вы можете построить программу с использованием Win32 API. Почему бы не вызвать ShowWindow()? –

+0

Потому что, как я уже сказал, программа hotkey/nircmd/etc. только предоставляют интерфейс для отправки/публикации сообщения (это похоже на скриптинг, а не компиляцию с заголовками и т. д.). – Synetech

ответ

2

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

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

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

+0

Видите, это то, что, как я думал, заставляло его работать не так, как ожидалось. Цитата, о которой вы говорили, именно то, о чем я думал вчера, когда я проверял страницу WM_SHOWWINDOW. Однако я не понимаю, почему идея должна казаться вам странной, так как вы можете отправить WM_CLOSE в окно, и оно закроется. Вы можете отправить WM_SIZE для изменения размера окна. Так почему же было бы необычно отправить WM_SHOWWINDOW, чтобы скрыть окно? – Synetech

+0

Это было бы. Большинство оконных сообщений (за некоторыми исключениями) являются уведомлениями, а не командами (WM_SIZE - это уведомление, WM_CLOSE - это команда). Также имейте в виду, что отправка * любого окна сообщения в неизвестном окне является рискованным. Вы не можете быть уверены, что окно когда-либо получит сообщение, и вы, конечно же, не можете быть уверены, что будет делать окно, когда оно его получит. Там нет гарантии, что окно будет закрыто в ответ на WM_CLOSE, например (хотя хорошо ведут себя окна). –

3

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

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

Или при использовании 3-го приложения сторонних нормально, попробуйте cmdow

+0

Что-то происходит (окно вспыхивает, а затем уходит). Я думаю, проблема в том, что это не просто свернутое окно, оно скрыто, поэтому это не совсем работает. У меня действительно есть копия cmdow (и других подобных приложений).Я надеялся только отправить сообщение, но если это просто не сработает, мне, возможно, придется прибегнуть к запуску внешнего приложения. – Synetech

0

Я думаю, что нет никакого способа добиться того, чтобы с 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); 
     } 
    } 
}