Re[5]: Не работает программа под Win7 x64
От: Vitt  
Дата: 21.12.11 09:10
Оценка: -1
Здравствуйте, bolide, Вы писали:

B>Здравствуйте, Vitt, Вы писали:


V>>На чем написано? Если на Delphi 7, то вы в курсе, что фиксить надо чтобы на таскбаре нормально отображалось?


B>О, а как фиксить? Не помню уже, может что-то и делал для этого, а может нет, но на таскбаре все мои дельфевые программы видно


Я обычно все формы не от TForm наследую, а от своего TVForm, выглядит примерно так:

type
TVForm = class(TForm)
private
//windows vista fixes
procedure HideAppFormTaskBarButton;
protected
procedure DoCreate; override;
//windows vista fixes
procedure CreateParams(var Params: TCreateParams); override;
procedure WMSyscommand(var Message: TWmSysCommand); message WM_SYSCOMMAND;
procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE;
end;


procedure TVForm.DoCreate;
begin
if IsWindowsVista then
begin
SetVistaFonts(Self);
//
if Application.MainForm = nil then
begin
HideAppFormTaskBarButton;
//фикс отрисовки при переключении по Alt. взял тут: http://qc.codegear.com/wc/qcmain.aspx?d=37403
//TVistaAltFix.Create(Self);
end;
end;
//
inherited;
end;

{$IFNDEF TOSVersionInfoEx}
type
POSVersionInfoExA = ^TOSVersionInfoExA;
POSVersionInfoEx = POSVersionInfoExA;
_OSVERSIONINFOEXA = packed record
dwOSVersionInfoSize: DWORD;
dwMajorVersion: DWORD;
dwMinorVersion: DWORD;
dwBuildNumber: DWORD;
dwPlatformId: DWORD;
szCSDVersion: array[0..127] of AnsiChar;
wServicePackMajor: WORD;
wServicePackMinor: WORD;
wSuiteMask: WORD;
wProductType: BYTE;
wReserved: BYTE;
end;
_OSVERSIONINFOEX = _OSVERSIONINFOEXA;
TOSVersionInfoExA = _OSVERSIONINFOEXA;
TOSVersionInfoEx = TOSVersionInfoExA;
OSVERSIONINFOEXA = _OSVERSIONINFOEXA;
OSVERSIONINFOEX = OSVERSIONINFOEXA;
{$ENDIF}

function IsWindowsVista: Boolean;
var
VerInfo: TOSVersionInfoEx;
pVerInfo: POSVersionInfo;
begin
VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfoEx);
pVerInfo := @VerInfo;
GetVersionEx(pVerInfo^);
Result := VerInfo.dwMajorVersion >= 6;
end;

procedure TVForm.HideAppFormTaskBarButton;
begin
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW
or WS_EX_TOOLWINDOW);
ShowWindow(Application.Handle, SW_SHOW);
end;

procedure TVForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
if IsWindowsVista then
begin
Params.ExStyle := Params.ExStyle and not WS_EX_TOOLWINDOW or
WS_EX_APPWINDOW;
end;
end;

procedure TVForm.WMSyscommand(var Message: TWmSysCommand);
begin
if IsWindowsVista then
begin
case (Message.CmdType and $FFF0) of
SC_MINIMIZE:
begin
ShowWindow(Handle, SW_MINIMIZE);
Message.Result := 0;
end;
SC_RESTORE:
begin
ShowWindow(Handle, SW_RESTORE);
Message.Result := 0;
end;
else
inherited;
end;
end else
inherited;
end;

procedure TVForm.WMActivate(var Message: TWMActivate);
begin
if IsWindowsVista then
begin
if (Message.Active = WA_ACTIVE) and not IsWindowEnabled(Handle) then
begin
SetActiveWindow(Application.Handle);
Message.Result := 0;
end else
inherited;
end else
inherited;
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.