Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


sergey3695, спасибо, но только-что смог таки скрыть тултипы (ведь знал же что библиотека в этом случае - перебор)
пихать в библиотеку это явно нет смысла:
Код: Выделить весь код
function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;
полный пример:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp


[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external
Source: steam.cjstyles; Flags: dontcopy
Source: isskin.dll; Flags: dontcopy


[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  WM_NCMOUSEMOVE = $00A0;
  
type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  SHORT = Longint;

var
  OldWindowProc: Longint;
  
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;

function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  if Msg = WM_NCMOUSEMOVE then EnumWindows(CallbackAddr('HideSystemTooltip'), 0);
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;


procedure InitializeWizard();
begin
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;

касательно сокрытия кнопки развернуть:
Mailchik, Спасибо большое за код. Знаю что стиль "Аэро" слетает, но не важно тк хотел использовать только со скином, но кнопка не текстурируется , поэтому
Mailchik, sergey3695, предлагаю доработанный метод подмены сообщений:
сис меню больше не вызывается при клике по иконке и за неё теперь можно таскать, + в том что сворачивание происходит при клике а не нажатии на кнопку:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  WM_SYSCOMMAND = $0112;
  SC_MINIMIZE = 61472;
  SC_MAXIMIZE = 61488;
  SC_SIZE = 61440;
  SC_MOVE = 61456;
  WM_NCLBUTTONDBLCLK = $00A3;
  MF_BYCOMMAND = 0;
  WM_NCLBUTTONDOWN = $00A1;
  WM_NCRBUTTONDOWN = $00A4;
  WM_NCMOUSEMOVE = $00A0;
  SC_CLOSE = 61536;
  VK_LBUTTON = 1;
  SC_DRAGMOVE = $F012;
  WM_JOHNY = 7777;

type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  SHORT = Longint;

var
  OldWindowProc: Longint;
  SysPopupMenu: TPopupMenu;

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall';
function GetKeyState(nVirtKey: Integer): SHORT; external 'GetKeyState@user32.dll stdcall';
function ReleaseCapture: BOOL; external 'ReleaseCapture@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;


function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
  pt: TPoint;
  rt: TRect;
begin
  case Msg of
    WM_SYSCOMMAND:
    case wParam of
      SC_MAXIMIZE:
      begin
        wParam := 0;
        SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
      end;
    end;
    WM_NCMOUSEMOVE: EnumWindows(CallbackAddr('HideSystemTooltip'), 0);
    WM_NCLBUTTONDBLCLK: Msg := 0; // двойной клик по заголовку окна
    WM_NCRBUTTONDOWN:
    begin
      Msg := 0;
      if GetCursorPos(pt) then SysPopupMenu.Popup(pt.x, pt.y);
    end;
    WM_NCLBUTTONDOWN: if GetCursorPos(pt) and GetWindowRect(hWnd, rt) then
    if (pt.x > rt.Left) and (pt.x < rt.Right-WizardForm.Width+27) and (pt.y > rt.Top) and (pt.y < rt.Bottom-WizardForm.Height+27) then
    begin
      ReleaseCapture;
      SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);

    end;
//    WM_JOHNY: MsgBox('демо подмены кнопок от Johny777 :)', mbInformation, MB_OK);
  end;
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;

procedure SysMenuOnClick(Sender: TObject);
begin
  case TMenuItem(Sender).Caption of
    'MINIMIZE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    'CLOSE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
    'MOVE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MOVE, 0);
  end;
end;

procedure InitializeWizard();
var
  hSYSMENU: HWND;
  mMinimize, mClose, mMove: TMenuItem;
begin
  WizardForm.BorderIcons := [biSystemMenu, biMaximize];
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
  SysPopupMenu := TPopupMenu.Create(WizardForm);
  with SysPopupMenu do
  begin
    mMinimize := TMenuItem.Create(WizardForm);
    with mMinimize do
    begin
      Caption := 'MINIMIZE';
      SysPopupMenu.Items.Add(mMinimize);
      OnClick := @SysMenuOnClick;
    end;
    mClose := TMenuItem.Create(WizardForm);
    with mClose do
    begin
      Caption := 'CLOSE';
      SysPopupMenu.Items.Add(mClose);
      OnClick := @SysMenuOnClick;
    end;
    mMove := TMenuItem.Create(WizardForm);
    with mMove do
    begin
      Caption := 'MOVE';
      SysPopupMenu.Items.Add(mMove);
      OnClick := @SysMenuOnClick;
    end;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpWelcome then SendMessage(WizardForm.Handle, WM_JOHNY, 0, 0);
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;

в сообщении sergey3695 есть перерисованный скин. Пробуйте. Есть рекомендации по улучшению - говорите! По возможности исправлю/добавлю

Мне осталось только доработать подменённое сис меню и добавить свои хинты (можно и через ISHint.dll)

============================================= UPDATE =========================================================

изучаю потихоньку вин апи, вот вам подарок:

читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[  code]
const
  FLASHW_STOP = $0;
  FLASHW_CAPTION = $1;
  FLASHW_TRAY = $2;
  FLASHW_ALL = FLASHW_CAPTION or FLASHW_TRAY;
  FLASHW_TIMER = $4;
  FLASHW_TIMERNOFG = $C;
  

type
  FLASHWINFO = record
    cbSize: UINT;
    hwnd: HWND;
    dwFlags: DWORD;
    uCount: UINT; // Число миганий
    dwTimeout: DWORD; // промежуток между миганиями
  end;


function FlashWindowEx(var pfwi: FLASHWINFO): BOOL; external 'FlashWindowEx@user32.dll stdcall';


procedure CurPageChanged(CurPageID: Integer);
var
  fl: FLASHWINFO;
begin
  fl.cbSize := SizeOf(fl);
  fl.dwTimeout := 777;
  fl.hwnd :=  Application.Handle;
  fl.uCount := 3;
  fl.dwFlags := FLASHW_TRAY;
  FlashWindowEx(fl);
end;


Последний раз редактировалось Johny777, 09-02-2013 в 15:34.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:12, 09-02-2013 | #1630