Кто-либо знает о приложении, которое закрыло бы окно, учитывая его дескриптор? Командная строка хороша.
Обратите внимание на то, что я не хочу уничтожать соответствующее приложение, скорее модальное окно, принадлежавшее тому приложению.
Объяснение:
Когда-то, модальное диалоговое окно открыто под главным окном на моем ноутбуке. Это произошло не однажды для VS и Firefox.Очень раздражает.
Я могу определить местоположение окна со Шпионом ++, но не иметь никаких средств уничтожения его.
Править:
Приложение, позволяющее отправить сообщения в произвольное окно, хорошо также, я предполагаю, что могу затем отправить что-то как WM_CLOSE или что бы то ни было.
Править:
Я хочу подчеркнуть, что я не интересен в закрытии видимого окна. Самое главное должно иметь дело с ужасными отклонениями, когда модальное диалоговое окно становится открытым под окном владения, которое произошло и не однажды для меня при работе с VS и Firefox. Так, требуемое решение состоит в том, чтобы закрыть окно своим дескриптором или, если оно могло бы конкретно определить местоположение затененных окон и ясно показать их.
Хорошо, я сделал небольшое приложение, которое добивается цели.
Можно загрузить его здесь.
Использование:
Это отправляет 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.
Вот сценарий 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
Это было бы отупляющим образом просто приготовить для себя. Я вижу, что Вы отклонили 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);
}
}
Я взял это в качестве оправдания испытать 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