home *** CD-ROM | disk | FTP | other *** search
- unit Modal2U2;
-
- {$ifdef Ver80} { Delphi 1.0x }
- {$define DelphiLessThan2}
- {$define DelphiLessThan3}
- {$define DelphiLessThan4}
- {$define DelphiLessThan5}
- {$endif}
- {$ifdef Ver90} { Delphi 2.0x }
- {$define DelphiLessThan3}
- {$define DelphiLessThan4}
- {$define DelphiLessThan5}
- {$endif}
- {$ifdef Ver93} { C++ Builder 1.0x }
- {$define DelphiLessThan3}
- {$define DelphiLessThan4}
- {$define DelphiLessThan5}
- {$endif}
- {$ifdef Ver100} { Delphi 3.0x }
- {$define DelphiLessThan4}
- {$define DelphiLessThan5}
- {$endif}
- {$ifdef Ver110} { C++ Builder 3.0x }
- {$define DelphiLessThan4}
- {$define DelphiLessThan5}
- {$endif}
- {$ifdef Ver120} { Delphi 4.0x }
- {$define DelphiLessThan5}
- {$endif}
-
- interface
-
- uses
- WinTypes, WinProcs, Messages, SysUtils, Classes, Graphics, Controls, Forms,
- Dialogs, Buttons, StdCtrls, ExtCtrls;
-
- type
- TFrmModalForm = class(TForm)
- Label1: TLabel;
- SpeedButton1: TSpeedButton;
- procedure SpeedButton1Click(Sender: TObject);
- private
- procedure DisplayKeyData(KeyData: Integer; CharCode: Word);
- { Make sure we can see dialog-type keys }
- procedure CMDialogKey(var Msg: TMessage); message cm_Dialogkey;
- { Trap normal keys... }
- procedure WMKeyDown(var Msg: TWMKeyDown); message wm_KeyDown;
- { ...as well as Alt+ keys }
- procedure WMSysKeyDown(var Msg: TWMSysKeyDown); message wm_SysKeyDown;
- public
- function ShowSystemModal: Integer;
- end;
-
- var
- FrmModalForm: TFrmModalForm;
-
- implementation
-
- {$R *.DFM}
-
- {$ifdef DelphiLessThan3}
- const
- VK_KANA = 21;
- VK_JUNJA = 23;
- VK_FINAL = 24;
- VK_HANJA = 25;
- VK_KANJI = 25;
- VK_CONVERT = 28;
- VK_NONCONVERT = 29;
- VK_ACCEPT = 30;
- VK_MODECHANGE = 31;
- VK_LWIN = 91;
- VK_RWIN = 92;
- VK_APPS = 93;
- VK_LSHIFT = 160;
- VK_RSHIFT = 161;
- VK_LCONTROL = 162;
- VK_RCONTROL = 163;
- VK_LMENU = 164;
- VK_RMENU = 165;
- VK_PROCESSKEY = 229;
- VK_ATTN = 246;
- VK_CRSEL = 247;
- VK_EXSEL = 248;
- VK_EREOF = 249;
- VK_PLAY = 250;
- VK_ZOOM = 251;
- VK_NONAME = 252;
- VK_PA1 = 253;
- VK_OEM_CLEAR = 254;
- {$endif}
-
- function GetVirtualKeyName(VK: Byte): String;
- begin
- case VK of
- VK_LBUTTON: Result := 'VK_LBUTTON'; {1}
- VK_RBUTTON: Result := 'VK_RBUTTON'; {2}
- VK_CANCEL: Result := 'VK_CANCEL'; {3}
- VK_MBUTTON: Result := 'VK_MBUTTON'; {4}
- VK_BACK: Result := 'VK_BACK'; {8}
- VK_TAB: Result := 'VK_TAB'; {9}
- VK_CLEAR: Result := 'VK_CLEAR'; {12}
- VK_RETURN: Result := 'VK_RETURN'; {13}
- VK_SHIFT: Result := 'VK_SHIFT'; {16}
- VK_CONTROL: Result := 'VK_CONTROL'; {17}
- VK_MENU: Result := 'VK_MENU'; {18}
- VK_PAUSE: Result := 'VK_PAUSE'; {19}
- VK_CAPITAL: Result := 'VK_CAPITAL'; {20}
- VK_KANA: Result := 'VK_KANA/VK_HANGUL'; {21}
- VK_JUNJA: Result := 'VK_JUNJA'; {23}
- VK_FINAL: Result := 'VK_FINAL'; {24}
- VK_KANJI: Result := 'VK_HANJA/VK_KANJI'; {25}
- VK_ESCAPE: Result := 'VK_ESCAPE'; {27}
- VK_CONVERT: Result := 'VK_CONVERT'; {28}
- VK_NONCONVERT: Result := 'VK_NONCONVERT'; {29}
- VK_ACCEPT: Result := 'VK_ACCEPT'; {30}
- VK_MODECHANGE: Result := 'VK_MODECHANGE'; {31}
- VK_SPACE: Result := 'VK_SPACE'; {32}
- VK_PRIOR: Result := 'VK_PRIOR'; {33}
- VK_NEXT: Result := 'VK_NEXT'; {34}
- VK_END: Result := 'VK_END'; {35}
- VK_HOME: Result := 'VK_HOME'; {36}
- VK_LEFT: Result := 'VK_LEFT'; {37}
- VK_UP: Result := 'VK_UP'; {38}
- VK_RIGHT: Result := 'VK_RIGHT'; {39}
- VK_DOWN: Result := 'VK_DOWN'; {40}
- VK_SELECT: Result := 'VK_SELECT'; {41}
- VK_PRINT: Result := 'VK_PRINT'; {42}
- VK_EXECUTE: Result := 'VK_EXECUTE'; {43}
- VK_SNAPSHOT: Result := 'VK_SNAPSHOT'; {44}
- VK_INSERT: Result := 'VK_INSERT'; {45}
- VK_DELETE: Result := 'VK_DELETE'; {46}
- VK_HELP: Result := 'VK_HELP'; {47}
- Ord('0'): Result := 'VK_0'; {48}
- Ord('1'): Result := 'VK_1'; {49}
- Ord('2'): Result := 'VK_2'; {50}
- Ord('3'): Result := 'VK_3'; {51}
- Ord('4'): Result := 'VK_4'; {52}
- Ord('5'): Result := 'VK_5'; {53}
- Ord('6'): Result := 'VK_6'; {54}
- Ord('7'): Result := 'VK_7'; {55}
- Ord('8'): Result := 'VK_8'; {56}
- Ord('9'): Result := 'VK_9'; {57}
- Ord('A'): Result := 'VK_A'; {65}
- Ord('B'): Result := 'VK_B'; {66}
- Ord('C'): Result := 'VK_C'; {67}
- Ord('D'): Result := 'VK_D'; {68}
- Ord('E'): Result := 'VK_E'; {69}
- Ord('F'): Result := 'VK_F'; {70}
- Ord('G'): Result := 'VK_G'; {71}
- Ord('H'): Result := 'VK_H'; {72}
- Ord('I'): Result := 'VK_I'; {73}
- Ord('J'): Result := 'VK_J'; {74}
- Ord('K'): Result := 'VK_K'; {75}
- Ord('L'): Result := 'VK_L'; {76}
- Ord('M'): Result := 'VK_M'; {77}
- Ord('N'): Result := 'VK_N'; {78}
- Ord('O'): Result := 'VK_O'; {79}
- Ord('P'): Result := 'VK_P'; {80}
- Ord('Q'): Result := 'VK_Q'; {81}
- Ord('R'): Result := 'VK_R'; {82}
- Ord('S'): Result := 'VK_S'; {83}
- Ord('T'): Result := 'VK_T'; {84}
- Ord('U'): Result := 'VK_U'; {85}
- Ord('V'): Result := 'VK_V'; {86}
- Ord('W'): Result := 'VK_W'; {87}
- Ord('X'): Result := 'VK_X'; {88}
- Ord('Y'): Result := 'VK_Y'; {89}
- Ord('Z'): Result := 'VK_Z'; {90}
- VK_LWIN: Result := 'VK_LWIN'; {91}
- VK_RWIN: Result := 'VK_RWIN'; {92}
- VK_APPS: Result := 'VK_APPS'; {93}
- VK_NUMPAD0: Result := 'VK_NUMPAD0'; {96}
- VK_NUMPAD1: Result := 'VK_NUMPAD1'; {97}
- VK_NUMPAD2: Result := 'VK_NUMPAD2'; {98}
- VK_NUMPAD3: Result := 'VK_NUMPAD3'; {99}
- VK_NUMPAD4: Result := 'VK_NUMPAD4'; {100}
- VK_NUMPAD5: Result := 'VK_NUMPAD5'; {101}
- VK_NUMPAD6: Result := 'VK_NUMPAD6'; {102}
- VK_NUMPAD7: Result := 'VK_NUMPAD7'; {103}
- VK_NUMPAD8: Result := 'VK_NUMPAD8'; {104}
- VK_NUMPAD9: Result := 'VK_NUMPAD9'; {105}
- VK_MULTIPLY: Result := 'VK_MULTIPLY'; {106}
- VK_ADD: Result := 'VK_ADD'; {107}
- VK_SEPARATOR: Result := 'VK_SEPARATOR'; {108}
- VK_SUBTRACT: Result := 'VK_SUBTRACT'; {109}
- VK_DECIMAL: Result := 'VK_DECIMAL'; {110}
- VK_DIVIDE: Result := 'VK_DIVIDE'; {111}
- VK_F1: Result := 'VK_F1'; {112}
- VK_F2: Result := 'VK_F2'; {113}
- VK_F3: Result := 'VK_F3'; {114}
- VK_F4: Result := 'VK_F4'; {115}
- VK_F5: Result := 'VK_F5'; {116}
- VK_F6: Result := 'VK_F6'; {117}
- VK_F7: Result := 'VK_F7'; {118}
- VK_F8: Result := 'VK_F8'; {119}
- VK_F9: Result := 'VK_F9'; {120}
- VK_F10: Result := 'VK_F10'; {121}
- VK_F11: Result := 'VK_F11'; {122}
- VK_F12: Result := 'VK_F12'; {123}
- VK_F13: Result := 'VK_F13'; {124}
- VK_F14: Result := 'VK_F14'; {125}
- VK_F15: Result := 'VK_F15'; {126}
- VK_F16: Result := 'VK_F16'; {127}
- VK_F17: Result := 'VK_F17'; {128}
- VK_F18: Result := 'VK_F18'; {129}
- VK_F19: Result := 'VK_F19'; {130}
- VK_F20: Result := 'VK_F20'; {131}
- VK_F21: Result := 'VK_F21'; {132}
- VK_F22: Result := 'VK_F22'; {133}
- VK_F23: Result := 'VK_F23'; {134}
- VK_F24: Result := 'VK_F24'; {135}
- VK_NUMLOCK: Result := 'VK_NUMLOCK'; {144}
- VK_SCROLL: Result := 'VK_SCROLL'; {145}
- VK_LSHIFT: Result := 'VK_LSHIFT'; {160}
- VK_RSHIFT: Result := 'VK_RSHIFT'; {161}
- VK_LCONTROL: Result := 'VK_LCONTROL'; {162}
- VK_RCONTROL: Result := 'VK_RCONTROL'; {163}
- VK_LMENU: Result := 'VK_LMENU'; {164}
- VK_RMENU: Result := 'VK_RMENU'; {165}
- $BA: Result := 'VK_SEMICOLON'; {186}
- $BB: Result := 'VK_EQUALS'; {187}
- $BC: Result := 'VK_COMMA'; {188}
- $BD: Result := 'VK_HYPHEN'; {189}
- $BE: Result := 'VK_PERIOD'; {190}
- $BF: Result := 'VK_SLASH'; {191}
- $C0: Result := 'VK_APOSTROPHE'; {192}
- $DB: Result := 'VK_OPENSQUARE'; {219}
- $DC: Result := 'VK_BACKSLASH'; {220}
- $DD: Result := 'VK_CLOSESQUARE'; {221}
- $DE: Result := 'VK_HASH'; {222}
- $DF: Result := 'VK_BACKAPOSTROPHE'; {223}
- VK_PROCESSKEY: Result := 'VK_PROCESSKEY'; {229}
- VK_ATTN: Result := 'VK_ATTN'; {246}
- VK_CRSEL: Result := 'VK_CRSEL'; {247}
- VK_EXSEL: Result := 'VK_EXSEL'; {248}
- VK_EREOF: Result := 'VK_EREOF'; {249}
- VK_PLAY: Result := 'VK_PLAY'; {250}
- VK_ZOOM: Result := 'VK_ZOOM'; {251}
- VK_NONAME: Result := 'VK_NONAME'; {252}
- VK_PA1: Result := 'VK_PA1'; {253}
- VK_OEM_CLEAR: Result := 'VK_OEM_CLEAR'; {254}
- else Result := Format('Virtual key %d', [VK]);
- end;
- end;
-
- procedure TFrmModalForm.DisplayKeyData(KeyData: Integer; CharCode: Word);
- var
- KeyNameC: array[0..255] of Char;
- KeyName: String;
- begin
- if GetKeyNameText(KeyData, KeyNameC, SizeOf(KeyNameC)) > 0 then
- KeyName := StrPas(KeyNameC)
- else
- Keyname := IntToStr(CharCode);
- Label1.Caption := Format(
- '%s (%s) %d $%2:x',
- [GetVirtualKeyName(Ord(CharCode)), KeyName, Ord(CharCode)]);
- end;
-
- { Make sure we can see dialog-type keys, e.g. Tab and cursors }
- procedure TFrmModalForm.CMDialogKey(var Msg: TMessage);
- begin
- Msg.Result := 0;
- end;
-
- { Trap normal keys... }
- procedure TFrmModalForm.WMKeyDown(var Msg: TWMKeyDown);
- begin
- DisplayKeyData(Msg.KeyData, Msg.CharCode);
- inherited
- end;
-
- { ...as well as Alt+ keys }
- procedure TFrmModalForm.WMSysKeyDown(var Msg: TWMSysKeyDown);
- begin
- DisplayKeyData(Msg.KeyData, Msg.CharCode);
- inherited
- end;
-
- procedure SetKeyboardAndTaskbarSwitching(Enable: Boolean);
- var
- OldVal: Bool;
- const
- TaskBarWnd: HWnd = 0; { Task bar window handle }
- ShowFlags: array[Boolean] of Integer = (sw_Hide, sw_ShowNoActivate);
- {$ifdef Windows}
- spi_ScreenSaverRunning = 97;
- {$endif}
- begin
- SystemParametersInfo(spi_ScreenSaverRunning, Word(not Enable), @OldVal, 0);
- {$ifdef Win32}
- if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
- {$else}
- if GetWinFlags and $4000 = 0 then
- {$endif}
- begin
- if TaskBarWnd = 0 then
- TaskBarWnd := FindWindow('Shell_TrayWnd', nil); { Find task bar }
- ShowWindow(TaskBarWnd, ShowFlags[Enable]); { Hide/show task bar }
- end
- end;
-
- function TFrmModalForm.ShowSystemModal: Integer;
- var
- Desktop: TForm;
- DesktopDC: HDC;
- begin
- Desktop := TForm.CreateNew(nil);
- try
- { Clear form seems to make less flicker }
- Desktop.Brush.Style := bsClear;
- Desktop.WindowState := wsMaximized;
- Desktop.BorderStyle := bsNone;
- DesktopDC := GetWindowDC(GetDesktopWindow);
- try
- with TImage.Create(Desktop) do
- begin
- Align := alClient;
- Picture.Bitmap.Height := Screen.Height;
- Picture.Bitmap.Width := Screen.Width;
- BitBlt(Canvas.Handle, 0, 0, Screen.Width,
- Screen.Height, DesktopDC, 0, 0, srcCopy);
- Parent := Desktop;
- end
- finally
- ReleaseDC(GetDesktopWindow, DesktopDC)
- end;
- Desktop.Show;
- { Ensure when anyone clicks on what looks like }
- { another window, all they get is a beep }
- Desktop.Enabled := False;
- SetKeyboardAndTaskbarSwitching(False);
- Result := ShowModal;
- SetKeyboardAndTaskbarSwitching(True)
- finally
- Desktop.Free
- end;
- end;
-
- procedure TFrmModalForm.SpeedButton1Click(Sender: TObject);
- begin
- Close
- end;
-
- end.
-