Как я могу закрыть окна их дескриптором?

Кто-либо знает о приложении, которое закрыло бы окно, учитывая его дескриптор? Командная строка хороша.

Обратите внимание на то, что я не хочу уничтожать соответствующее приложение, скорее модальное окно, принадлежавшее тому приложению.

Объяснение:

Когда-то, модальное диалоговое окно открыто под главным окном на моем ноутбуке. Это произошло не однажды для VS и Firefox.Очень раздражает.

Я могу определить местоположение окна со Шпионом ++, но не иметь никаких средств уничтожения его.

Править:

Приложение, позволяющее отправить сообщения в произвольное окно, хорошо также, я предполагаю, что могу затем отправить что-то как WM_CLOSE или что бы то ни было.

Править:

Я хочу подчеркнуть, что я не интересен в закрытии видимого окна. Самое главное должно иметь дело с ужасными отклонениями, когда модальное диалоговое окно становится открытым под окном владения, которое произошло и не однажды для меня при работе с VS и Firefox. Так, требуемое решение состоит в том, чтобы закрыть окно своим дескриптором или, если оно могло бы конкретно определить местоположение затененных окон и ясно показать их.

4
задан 01.01.2013, 19:35

5 ответов

Хорошо, я сделал небольшое приложение, которое добивается цели.

Screenshot

Можно загрузить его здесь.

Использование:

  1. Запустите программу
  2. Держите свою мышь по окну, которое Вы хотите закрыть (не нажимайте на него),
  3. Нажатие удаляет.

Это отправляет wm_close в окно под курсором мыши.

Код Delphi ниже...

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
ответ дан 07.12.2019, 19:32

Вот сценарий Perl, чтобы сделать это:

#!/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}");
}

И вот некоторые развлечения с помощью такого сценария (не рассматривайте этот спам, я просто пытаюсь проиллюстрировать использование Win32 Perl:: GuiTest: http://www.youtube.com/watch?v=BAg7K_uwNZs

1
ответ дан 07.12.2019, 19:32

Это было бы отупляющим образом просто приготовить для себя. Я вижу, что Вы отклонили Perl. Каков Ваш любимый язык?

Вот простой пример C (не протестирован, идя из памяти):

#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);
}

Это - простой пример C# (снова, не протестированный):

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
ответ дан 07.12.2019, 19:32

Пресса Высокий звук + Esc для отправки текущего активного окна в спину. Продолжайте нажимать это, пока Вы не приедете в диалоговое окно. Это циклически повторится даже через окна не в Высоком звуке + список Вкладки.

0
ответ дан 07.12.2019, 19:32

Я взял это в качестве оправдания испытать Win32API для 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

Используя это можно закрыть новый блокнот с

> ruby closewindow.rb "Untitled - Notepad"

или если Вы знаете дескриптор

> ruby closewindow.rb 15794730
3
ответ дан 07.12.2019, 19:32

Теги

Похожие вопросы