Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Win32 - иконка   Sergey Gernichenko   11 Nov 2003 12:39:46 
 Win32 - иконка   Alexander Reznikov   13 Nov 2003 22:49:37 
Архивное /ru.perl/133343fb3e074.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional