|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alexander Reznikov 2:4600/220 13 Nov 2003 22:49:37 To : Sergey Gernichenko Subject : Win32 - иконка -------------------------------------------------------------------------------- Как-то Sergey Gernichenko писал к All, но я услышал и решил ответить : SG> С помощью модуля Win32::Console можно задать заголовок окна консоли. А SG> можно ли изменить иконку консольного окна в процессе выполнения SG> скрипта? Hе так там всё просто. Это, скорее, winapi, чем perl. Hу ладно, несмотря на некоторую оффтопичность, я рискну. Imho, проще это дело на C написать. Или, раз уж надо, то модуль сделать. Заодно проблемы с восстановлением за счёт DESTROY решатся. ==== use strict; use Win32; use Win32::API; use Win32::Console; # Получаем HWND консольного окна. Hе слишком тривиальная задача. # Под NT(W2K? не помню) есть GetConsoleWindow. Ежли её нету - придётся искать # окно. # my $hwnd; if (Win32::IsWinNT()) { my $GetConsoleWindow = new Win32::API('kernel32', 'GetConsoleWindow', [], 'N'); $hwnd = $GetConsoleWindow->Call() if defined($GetConsoleWindow); } if (!defined($hwnd)) { my $GetCurrentThreadId = new Win32::API('kernel32', 'GetCurrentThreadId', [], 'N'); my $FindWindow = new Win32::API('user32', 'FindWindow', ['P', 'P'], 'N'); my $console = new Win32::Console; my $title = $console->Title(); my $newtitle = sprintf("ConsoleWindow-%04x-%08x-%04x", int(rand(0xffff)), $GetCurrentThreadId->Call(), int(rand(0xffff))); for(1 .. 20) { $console->Title($newtitle); last if ($hwnd = $FindWindow->Call(0, $newtitle)); Win32::Sleep(100); } $console->Title($title); } die "Hе найдено консольное окно!\n" if !$hwnd; print "HWND: $hwnd\n"; my $SendMessage = new Win32::API('user32', 'SendMessage', ['N', 'I', 'I', 'N'], 'N'); my $LoadImage = new Win32::API('user32', 'LoadImage', ['N', 'P', 'I', 'I', 'I', 'I'], 'N'); my $DestroyIcon = new Win32::API('user32', 'DestroyIcon', ['N'], 'N'); # Сохраняем старые иконки. Хорошо бы их восстанавливать на выходе даже при # исключительных ситуациях, иначе у консольного окна кариес с иконками случится # SendMessage(hwnd, WM_GETICON, ICON_BIG, 0); my $oldicon_big = $SendMessage->Call($hwnd, 127, 1, 0); # SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0); my $oldicon_small = $SendMessage->Call($hwnd, 127, 0, 0); # LoadImage(NULL, 'apps.ico', IMAGE_ICON, 0, 0, LR_LOADFROMFILE|LR_LOADTRANSPARENT); my $icon = $LoadImage->Call(0, 'apps.ico', 1, 0, 0, 16|32); # SendMessage(hwnd, WM_SETICON, ICON_BIG, icon); $SendMessage->Call($hwnd, 128, 1, $icon); # SendMessage(hwnd, WM_SETICON, ICON_SMALL, icon); $SendMessage->Call($hwnd, 128, 0, $icon); # Тут делаем то, ради чего всё это затевалось <STDIN>; # Восстанавливаем старые иконки и выгружаем загруженную $SendMessage->Call($hwnd, 128, 1, $oldicon_big); $SendMessage->Call($hwnd, 128, 0, $oldicon_small); $DestroyIcon->Call($icon); ==== Баюшки !! [ Черёмухин aka Гибкость TEAM ] [ UU9JЁКЛМH ] --- Дедушка GoldED+ 1.1.5-2003.11.04 (Win9x 4.10.2222 i586) * Origin: Я гибкий! Я инопланетянин! (c) Alex Cheryomukhin (2:4600/220) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/133343fb3e074.html, оценка из 5, голосов 10
|