Questão Como posso fechar as janelas pela sua alça?


Alguém sabe de uma aplicação que fecharia uma janela dada a sua alça? Linha de comando é boa.

Note que não desejo matar o respectivo aplicativo, e sim uma janela modal de propriedade desse aplicativo.

Fundamentação:

Às vezes, uma caixa de diálogo modal é aberta abaixo da janela principal do meu laptop. Isso não aconteceu uma vez para o VS e o Firefox. Muito irritante.

Eu posso localizar a janela com o Spy ++, mas não tenho como matá-la.

EDITAR:

Um aplicativo que permite enviar mensagens para uma janela arbitrária também é bom, acho que posso enviar algo como WM_CLOSE ou qualquer outra coisa.

EDITAR:

Gostaria de salientar que não sou interessante em fechar uma janela visível. O ponto principal é lidar com anormalidades desagradáveis ​​quando uma caixa de diálogo modal fica aberta sob a janela de propriedade, o que aconteceu e não uma vez para mim enquanto trabalhava com o VS e o Firefox. Portanto, a solução desejada é fechar uma janela pela alça ou, se puder, localizar especificamente janelas obscuras e trazê-las adiante.


2


origem


Alt-Tab geralmente traz o diálogo modal de volta ao topo. - Remus Rusanu
Bem, não nos meus cenários. Isso só acontece se a caixa de diálogo modal estiver aberta com um determinado estilo de janela (não se lembra exatamente), o que faz com que a caixa de diálogo apareça na barra de tarefas.


Respostas:


Ok, eu fiz um pequeno aplicativo que faz o truque.

Screenshot

Você pode baixá-lo Aqui.

Uso:

  1. Comece o programa
  2. Segure o mouse sobre a janela que você quer fechar (não clique nela)
  3. Pressione excluir.

Ele envia um wm_close para a janela sob o cursor do mouse.

Código Delphi abaixo ...

unit uCloseWindow;

interface

uses
  Windows, Forms, Messages, SysUtils, Variants, Classes, Controls;

type
  TfrmMain = class(TForm)
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  public
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  HandleUnderCursor:HWND;
begin
  if Key=VK_DELETE then
  begin
    HandleUnderCursor := WindowFromPoint(Mouse.CursorPos);
    SendMessage(HandleUnderCursor,WM_CLOSE,0,0)
  end;
end;

end.

4



Não é bom. Como eu disse, a janela está escondida atrás de outra janela. Todo o propósito é lidar com esses casos feios.
Veja o segundo EDIT no meu post.
Não, você disse que estava "abaixo" de outra janela (indicando a posição y) e não mencionou que a janela não estava visível. É um pouco rude da sua parte recusar após o esforço que fiz para te ajudar.
No segundo pensamento, você está certo. Eu deveria ter me explicado melhor. Você pode recusar a minha pergunta em troca, por causa dessa ausência de clareza, eu a mereço justamente.
Não há razão para recusar esta resposta. É um válido programação responder a uma questão não tão relacionada com programação. O voto recíproco é dificilmente produtivo. - Sinan Ünür


Eu tomei isso como uma desculpa para experimentar o Win32API para Ruby.

require 'Win32API'

WM_CLOSE = 0x0010
FindWindow = Win32API.new('user32', 'FindWindow', ["P", "P"], "L")
SendMessage = Win32API.new('user32', 'SendMessage', ["L", "L", "P", "P"], "L")

def Send_WM_CLOSE(title)
  handle = FindWindow.call(nil, title)
  SendMessage.call(handle, WM_CLOSE, nil, nil) if handle != 0
end

if ARGV[0].to_i==0
  title=String.new(ARGV[0])
  Send_WM_CLOSE(title)
else
  SendMessage.call(ARGV[0].to_i, WM_CLOSE, nil, nil)
end

Usando isso você pode fechar um bloco de notas fresco com

> ruby closewindow.rb "Untitled - Notepad"

ou se você conhece a alça

> ruby closewindow.rb 15794730

2



Bom, mas não vou instalar o Ruby para isso :-)
Há um instalador de um clique, caso você mude de ideia. rubyforge.org/projects/rubyinstaller - Jonas Elfström


Aqui está um script em Perl para fazer isso:

#!/usr/bin/perl

use strict;
use warnings;

use Win32::GuiTest qw(FindWindowLike SendKeys SetForegroundWindow);

die "Need pattern to match against window titles\n" unless @ARGV;
my ($windowtitle) = @ARGV;

my ($myhandle) = FindWindowLike(0, qr/winclose\.pl/);

my @windows = FindWindowLike(0, qr/\Q$windowtitle\E/i);

for my $handle ( @windows ) {
    next if $handle == $myhandle;
    SetForegroundWindow($handle);
    SendKeys("%{F4}");
}

E aqui está algum entretenimento usando esse script (por favor, não considere este spam, estou apenas tentando ilustrar o uso do Perl Win32 :: GuiTest: http://www.youtube.com/watch?v=BAg7K_uwNZs


1



Fofa. Mas eu não sinto como instalar o perl apenas para isso.


Isso seria simplesmente simples de cozinhar para você. Eu vejo que você rejeitou Perl. Qual sua lingua preferida?

Aqui está um exemplo simples de C (não testado, indo da memória):

#include <windows.h>
#include <stdio.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
    HWND hWnd;

    if(!sscanf(lpCmdLine, "%i", &hWnd)){
        MessageBox(null, "Invalid argument", "Close Window", MB_OK | MB_ICONERROR);
        return 1;
    }

    PostMessage(hWnd, WM_CLOSE, 0, 0);
}

Este é um exemplo simples de c # (novamente, não testado):

using System;
using System.Runtime.Interop;

static class Program{
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    static extern int PostMessage(int hWnd, int msg, int wParam, int lParam);

    const int WM_CLOSE = 16;

    static void Main(string[] args){
        int hWnd;
        if(args.Length == 1 && int.TryParse(args[0], out hWnd))
            PostMessage(hWnd, WM_CLOSE, 0, 0);
        else MessageBox.Show("Invalid Argument", "CloseWindow", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

1



Você está certo. Eu queria saber se há mais soluções amigáveis ​​ao usuário. Embora, eu mencionei linha de comando simples é bom o suficiente, geralmente espera-se algum UI que permite que você selecione a janela, diz-lhe todo o tipo de informação sobre isso, etc ... A partir de agora, eu ainda tenho que emparelhá-lo com o Spy ++ . Mas você está certo, no entanto.
Torná-lo em uma GUI não levaria muito mais, exceto por um pequeno investimento no tempo. O comportamento de arrastar um alvo e destacar uma janela do Spy ++ é muito fácil de duplicar com um ícone e um cursor apropriados. O destaque da janela é feito facilmente com as funções WinAPI GetWindowRgn e FrameRgn. Existem outras funções da API que fornecem informações sobre a janela que você está procurando. E SetWindowPos pode ser usado para trazer o diálogo de destino para o topo da ordem Z para que você possa vê-lo e interagir com ele, em vez de apenas fechá-lo.
Tudo é fácil e tudo leva tempo que não temos. Por que inventar uma roda se provavelmente já foi inventada? Eu sei como isso funciona, você desenvolve um pequeno utilitário para uso próprio, então você o estende, então você o depura para corrigir erros e facilmente se vê perdendo alguns dias em algo já feito e testado por outros.
Você tem um bom ponto. Mas, por outro lado, em um caso como este, acredito que mais tempo pode ser gasto procurando uma solução existente do que construir uma. Nem toda necessidade esotérica já é satisfeita satisfatoriamente por um produto existente - um fato ao qual devo minha prosperidade.


pressione Alt + Esc para enviar a janela atual em primeiro plano para trás. Continue pressionando até chegar ao diálogo. Isto irá percorrer até as janelas que não estão no Alt + Aba Lista.


0