WIN2K2.PAS 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. unit Win2K2;
  2. INTERFACE
  3. Uses CoolKey,CoolMice,Graph,Dos;
  4. {$I Wtypes.pas}
  5. {$I Errors.pas}
  6. {$I WMs.pas}
  7. {Main procedures}
  8. var
  9. GlobalPalette : TPalette;
  10. Function InitWin2K2:UInt16;
  11. Function DoneWin2K2:UInt16;
  12. Function MainRunLoop:UInt16;
  13. Function Alloc(cbSize:Uint32):Pointer;
  14. Function RegisterClass(aName:String;MainWndProc:TWndProc):UInt16;
  15. Function CreateWindow(aTitle,aClassName:string;
  16. aStyles:UINT32;
  17. aX,aY,aW,aH:Int16;
  18. aParent:HWND;
  19. aMenu:HMENU
  20. ):hWnd;
  21. Function DefWindowProc(ahWnd:HWND;aMsg: UINT32; awParam,alParam:UINT32):UInt32;
  22. Function PostQuitMessage(ahWnd:HWND):INT16;
  23. Function SendMessage(ahWnd:HWND;aMsg,wParam,lParam:UINT32):UINT32;
  24. Function PostMessage(ahWnd:HWND;aMsg,wParam,lParam:UINT32):UINT32;
  25. Function FindWindow(aT,aC : PString):HWND;
  26. Function FindChildWindow(aH:HWND;aT,aC : PString):HWND;
  27. Function WindowFromPoint(aP:POINT):HWND;
  28. Function ChildWindowFromPoint(aParent:hWnd;aP:POINT):HWND;
  29. Function GetWindowText(aH:HWND;aS:PString;StrLen:UINT8):UINT8;
  30. Function SetWindowText(aH:HWND;aS:PString):UINT8;
  31. Function PrintChar(SC:UINT8):boolean;
  32. Function AddOnFrameMessage(aH:hWnd):boolean;
  33. Function DelOnFrameMessage(aH:hWnd):boolean;
  34. {---}
  35. Procedure GetClientRect(aH:HWND;aR:LPRECT);
  36. Procedure GetGlobalRect(aH:HWND;aR:LPRECT);
  37. PRocedure GlobalToClient(aH:HWND;aX,aY:INT16;aR:LPPOINT);
  38. Function GetParent(aH:HWND):HWND;
  39. Function IsKeyActive(aH:HWND):Boolean;
  40. {GDI}
  41. Function BeginPaint(aH:HWND):LPPAINTSTRUCT;
  42. Procedure EndPaint(aP:LPPAINTSTRUCT);
  43. Procedure wSetBgColor(aP:LPPAINTSTRUCT;aNewColor:INT8);
  44. Procedure wSetColor(aP:LPPAINTSTRUCT;aNewColor:INT8);
  45. Procedure wSetFont(aP:LPPAINTSTRUCT;aNewFont:INT8);
  46. Procedure wSetFontJustify(aP:LPPAINTSTRUCT;aNewH,aNewV:INT8);
  47. Procedure wSetStyle(aP:LPPAINTSTRUCT;aNewStyle:INT8);
  48. Procedure wSetFontSize(aP:LPPAINTSTRUCT;aNewColor:INT8);
  49. Function wMoveToEx(aP:LPPAINTSTRUCT;X,Y:INT16;lP:LPPOINT):Boolean;
  50. Function wLineTo(aP:LPPAINTSTRUCT;X,Y:INT16):Boolean;
  51. Function wTextOut(aP:LPPAINTSTRUCT;X,Y:INT16;aStr:PString):Boolean;
  52. Function wRectangle(aP:LPPAINTSTRUCT;X1,Y1,X2,Y2:INT16):Boolean;
  53. Function wLine(aP:LPPAINTSTRUCT;X1,Y1,X2,Y2:INT16):Boolean;
  54. Function wBar(aP:LPPAINTSTRUCT;X1,Y1,X2,Y2:INT16):Boolean;
  55. Function wFillCircle(aP:LPPAINTSTRUCT;X1,Y1,Rad:INT16):Boolean;
  56. IMPLEMENTATION
  57. Var
  58. AllClasses : PClassArray;
  59. AllWindows : PWindow;
  60. TopMost : PWindow;
  61. AllFonts : PFontDefArray;
  62. FontCount : UINT16;
  63. AllMenus : PMenuList;
  64. KillList : PWndList;
  65. OnFrameList : PWndList;
  66. AllCursors : PCursorArr;
  67. CursorCnt : UINT8;
  68. {-----------------------------------------------------------------------}
  69. CONST
  70. GlobHandle : hWnd = 1;
  71. gResizeThr : INT16 = 4;
  72. LastError : Uint16 = 0;
  73. ClassesInitCnt : Uint16 = 20;
  74. ClassesCntInc : UInt16 = 5;
  75. ClassesCnt : Uint16 = 0;
  76. bNeedRender : boolean = true;
  77. {-----------------------------------------------------------------}
  78. Procedure EGAVGADriver;external;
  79. {$I procW2K2.pas}
  80. Function InitWin2K2:UInt16;
  81. Begin
  82. LastError := wInitKeyboard;
  83. if (LastError <> ERR_OK) then
  84. begin
  85. InitWin2K2 := LastError;
  86. Exit;
  87. end;
  88. LastError := wInitMouse;
  89. if (LastError <> ERR_OK) then
  90. begin
  91. InitWin2K2 := LastError;
  92. Exit;
  93. end;
  94. LastError := wInitGraph;
  95. if (LastError <> ERR_OK) then
  96. begin
  97. InitWin2K2 := LastError;
  98. Exit;
  99. end;
  100. New(AllMenus);
  101. AllMenus^.Handle :=0;
  102. AllMenus^.Next := nil;
  103. AllMenus^.Mn := nil;
  104. AllClasses := PClassArray(Alloc(ClassesInitCnt * sizeof(TClass)));
  105. if AllClasses = nil then
  106. begin
  107. InitWin2K2 := ERR_NOMEM;
  108. LastError := ERR_NOMEM;
  109. Exit;
  110. end;
  111. New(AllWindows);
  112. With AllWindows^ do
  113. begin
  114. WClass := nil;
  115. Handle := 0;
  116. Parent := Nil;
  117. Child := nil;
  118. Brother:= nil;
  119. Title := nil;
  120. Queue := nil;
  121. zOrder := nil;
  122. Next := nil;
  123. end;
  124. TopMost := AllWindows;
  125. KillList := nil;
  126. wInitGlobalPalette;
  127. wInitFonts;
  128. wInitTitleButtons;
  129. LastError := ERR_OK;
  130. InitWin2K2 := ERR_OK;
  131. end;{}
  132. {-----------------------------------}
  133. Function DoneWin2K2:UInt16;
  134. var
  135. c : PWindow;
  136. i : UINT16;
  137. kl: PWndList;
  138. Begin
  139. IF AllClasses <> nil then
  140. begin
  141. For i:=0 to ClassesCnt-1 do FreeMem(AllClasses^[i].Name,ord(AllClasses^[i].Name^[0])+1);
  142. FreeMem(AllCLasses, ClassesInitCnt * sizeof(TClass));
  143. end;
  144. While AllWindows <> nil do
  145. begin
  146. c:=AllWindows^.Next;
  147. if AllWindows^.Title <> nil then
  148. FreeMem(AllWindows^.Title,ord(AllWindows^.Title^[0])+1);
  149. Dispose(AllWindows);
  150. AllWindows := C;
  151. end;
  152. while KillList <> nil do
  153. begin
  154. wDestroyWindow(KillList^.Wnd);
  155. kl := KillList^.Next;
  156. Dispose(KillList);
  157. KillList:=kl;
  158. end;
  159. while OnFrameList <> nil do
  160. begin
  161. kl := OnFrameList^.Next;
  162. Dispose(OnFrameList);
  163. OnFrameList:=kl;
  164. end;
  165. wDoneGraph;
  166. wDoneMouse;
  167. wDoneKeyboard;
  168. DoneWin2k2 := 0;
  169. LastError := ERR_OK;
  170. end;{}
  171. {-----------------------------------}
  172. Function MainRunLoop:UInt16;
  173. var
  174. c : PWindow;
  175. q,nq : PMessageList;
  176. kl : PWndList;
  177. Begin
  178. while (AllWindows^.Next <> nil) do
  179. begin
  180. ProcessKeyboard;
  181. ShowMouse;
  182. ProcessMouse;
  183. c := AllWindows^.Next;
  184. while c <> nil do
  185. begin
  186. q := c^.Queue^.Next;
  187. while q <> nil do
  188. begin
  189. wSendMessage(c,q^.msg.Message,q^.msg.wParam,q^.msg.lParam);
  190. nq := q^.next;
  191. Dispose(q);
  192. q := nq;
  193. end;
  194. c^.Queue^.Next := nil;
  195. c := c^.next;
  196. end;
  197. while KillList <> nil do
  198. begin
  199. wDestroyWindow(KillList^.Wnd);
  200. kl := KillList^.Next;
  201. Dispose(KillList);
  202. KillList:=kl;
  203. end;
  204. kl := OnFrameList;
  205. while kl <> nil do
  206. begin
  207. wSendMessage(kl^.wnd,WM_ONFRAME,0,0);
  208. kl := kl^.next;
  209. end;
  210. if bNeedRender then wRenderAll;
  211. end;
  212. end;{}
  213. {-----------------------------------}
  214. Function RegisterClass(aName:String;MainWndProc:TWndProc):UInt16;
  215. Var
  216. cp : PClass;
  217. na : PClassArray;
  218. Begin
  219. cp := wGetClass(aName);
  220. if (cp <> nil) then
  221. begin
  222. RegisterClass:=ERR_CLASSEXIST;
  223. LastError := ERR_CLASSEXIST;
  224. exit;
  225. end;
  226. if ClassesCnt = ClassesInitCnt then
  227. begin
  228. na := Alloc(sizeof(TClass) * (ClassesInitCnt + ClassesCntInc));
  229. if (na = nil) then
  230. begin
  231. RegisterClass := ERR_NOMEM;
  232. LastError := ERR_NOMEM;
  233. Exit;
  234. end;
  235. Move(AllClasses,Na,sizeof(TClass) * (ClassesInitCnt));
  236. Inc(ClassesInitCnt,ClassesCntInc);
  237. end;
  238. with AllClasses^[ClassesCnt] do
  239. begin
  240. Name := Alloc(ord(aName[0])+1);
  241. Name^ := aName;
  242. WndProc := MainWndProc;
  243. end;
  244. Inc(ClassesCNT);
  245. RegisterClass := ERR_OK;
  246. LastError := ERR_OK;
  247. end;{}
  248. {-----------------------------------}
  249. Function CreateWindow(aTitle,aClassName:string;aStyles:UINT32;aX,aY,aW,aH:Int16;
  250. aParent:HWND;aMenu:HMENU):hWNd;
  251. Var
  252. mNew, c : PWindow;
  253. mClass : PClass;
  254. g1 : hWnd;
  255. Begin
  256. mClass := wGetClass(aClassName);
  257. if mClass = nil then
  258. begin
  259. CreateWindow := 0;
  260. LastError := ERR_BADCLASS;
  261. Exit;
  262. end;
  263. New(mNew);
  264. with mNew^ do
  265. begin
  266. WClass := mClass;
  267. Handle := GlobHandle;Inc(GlobHandle);
  268. Style := aStyles;
  269. Parent := nil;
  270. New(Palette);
  271. Palette^ := GlobalPalette;
  272. New(Child);
  273. Child^.Brother := nil;
  274. Brother:= nil;
  275. if aParent <> NULL then
  276. begin
  277. Parent := wGetWndByhWnd(aParent);
  278. if Parent=NIL then
  279. begin
  280. CreateWindow := 0;
  281. LastError := ERR_NOPARENT;
  282. Dispose(mNew);
  283. Exit;
  284. end;
  285. c := Parent^.Child;
  286. while c^.Brother <> nil do c:=c^.Brother;
  287. c^.Brother := mNew;
  288. end;
  289. Title := PString(Alloc(ord(aTitle[0])+1));
  290. Title^ := aTitle;
  291. Pos.A.x :=aX; Pos.a.y := aY; Pos.B.X := aW; Pos.B.Y := aH;
  292. New(Queue);
  293. Menu := nil;
  294. if aMenu <> NULL then
  295. begin
  296. Menu := wGetMenuByhMenu(aMenu);
  297. if Menu = nil then
  298. begin
  299. CreateWindow := 0;
  300. LastError := ERR_BADMENU;
  301. Dispose(mNew);
  302. Exit;
  303. end;
  304. end;
  305. Queue^.Next := Nil;
  306. zOrder := nil;
  307. Next := nil;
  308. end;
  309. if mNew^.Parent = nil then
  310. begin
  311. mNew^.zOrder := TopMost^.zOrder;
  312. TopMost^.zOrder := mNew;
  313. mNew^.bActive := true;
  314. KeyActive := mNew;
  315. gActiveParent := mNew;
  316. gActiveWindow := mNew;
  317. end;
  318. c := AllWindows;
  319. while c^.next <> nil do c:=c^.next;
  320. c^.next := mNew;
  321. if (mNew^.Style AND WS_TITLE) = WS_TITLE then
  322. begin
  323. g1:=CreateWindow('','CLOSEBUTTON',WS_CHILD,
  324. aW-mNew^.Palette^.ActTitleSize-2,-mNew^.Palette^.ActTitleSize+2,
  325. mNew^.Palette^.ActTitleSize-5,mNew^.Palette^.ActTitleSize-5,
  326. mNew^.Handle,NULL);
  327. if (mNew^.Style AND WS_MINMAX) = WS_MINMAX then
  328. begin
  329. g1:=CreateWindow('','MINBUTTON',WS_CHILD,
  330. aW-3*mNew^.Palette^.ActTitleSize-2,-mNew^.Palette^.ActTitleSize+2,
  331. mNew^.Palette^.ActTitleSize-5,mNew^.Palette^.ActTitleSize-5,
  332. mNew^.Handle,NULL);
  333. g1:=CreateWindow('','MAXBUTTON',WS_CHILD,
  334. aW-2*mNew^.Palette^.ActTitleSize-4,-mNew^.Palette^.ActTitleSize+2,
  335. mNew^.Palette^.ActTitleSize-5,mNew^.Palette^.ActTitleSize-5,
  336. mNew^.Handle,NULL);
  337. end;
  338. end;
  339. wSendMessage(mNew, WM_CREATE, 0, UINT32(mNew));
  340. LastError := ERR_OK;
  341. CreateWindow := mNew^.Handle
  342. end;{}
  343. {-----------------------------------}
  344. Function SendMessage(ahWnd:HWND;aMsg,wParam,lParam:UINT32):UINT32;
  345. var
  346. c : PWindow;
  347. begin
  348. c := wGetWndByhWnd(ahWnd);
  349. if (c=nil) then
  350. begin
  351. LastError := ERR_BADHANDLE;
  352. Exit;
  353. end;
  354. SendMessage := c^.WClass^.WndProc(c^.Handle,aMsg,wParam,lParam);
  355. LastError := ERR_OK;
  356. end;
  357. {-----------------------------------}
  358. Function PostMessage(ahWnd:HWND;aMsg,wParam,lParam:UINT32):UINT32;
  359. var
  360. c : PWindow;
  361. begin
  362. c := wGetWndByhWnd(ahWnd);
  363. if c=nil then
  364. begin
  365. PostMessage := ERR_BADHANDLE;
  366. LastError := ERR_BADHANDLE;
  367. Exit;
  368. end;
  369. PostMessage := wPostMessage(c,aMsg,wParam,lParam);
  370. PostMessage := ERR_OK;
  371. LastError := ERR_OK;
  372. end;
  373. {-----------------------------------}
  374. Function WindowFromPoint(aP:POINT):HWND;
  375. var
  376. c : PWindow;
  377. begin
  378. WindowFromPoint := NULL;
  379. c := wWindowFromPoint(aP);
  380. if c <> nil then WindowFromPoint := c^.handle;
  381. LastError := ERR_OK;
  382. end; {WindowFromPoint}
  383. {-----------------------------------}
  384. Function ChildWindowFromPoint(aParent:hWnd;aP:POINT):HWND;
  385. var
  386. c : PWindow;
  387. begin
  388. ChildWindowFromPoint := aParent;
  389. c := wGetWndByHWND(aParent);
  390. if c=nil then
  391. begin
  392. LastError := ERR_BADHANDLE;
  393. ChildWindowFromPoint := NULL;
  394. Exit;
  395. end;
  396. c := wChildWindowFromPoint(c,aP);
  397. if c <> nil then ChildWindowFromPoint := c^.Handle;
  398. end; {ChildWindowFromPoint}
  399. {-----------------------------------}
  400. Function DefWindowProc(ahWnd:HWND;aMsg: UINT32; awParam,alParam:UINT32):UInt32;
  401. begin
  402. case aMsg of
  403. WM_DESTROY:PostQuitMessage(ahWnd);
  404. WM_SETTEXT:SetWindowText(ahWnd,PString(alParam));
  405. WM_GETTEXT:GetWindowText(ahWnd,PString(alParam),awParam);
  406. end;
  407. end;
  408. {-----------------------------------}
  409. Function PostQuitMessage;
  410. var
  411. aNew,c : PWndList;
  412. wnd : PWindow;
  413. begin
  414. Wnd := wGetWndByHWND(ahWnd);
  415. if Wnd = nil then
  416. begin
  417. LastError := ERR_BADHANDLE;
  418. Exit;
  419. end;
  420. New(aNew);
  421. aNew^.Wnd := Wnd;
  422. aNew^.Next := nil;
  423. c := KillList;
  424. if c<>nil then
  425. begin
  426. while c^.Next <> nil do c:=c^.next;
  427. c^.next := aNew;
  428. end
  429. else
  430. KillList := aNew;
  431. end;
  432. {-----------------------------------------------}
  433. Procedure GetClientRect(aH:HWND;aR:LPRECT);
  434. var
  435. wnd : PWindow;
  436. begin
  437. wnd:=wGetWndByHWND(aH);
  438. if (wnd = nil) or (aR = nil) then
  439. begin
  440. LastError := ERR_BADHANDLE;
  441. Exit;
  442. end;
  443. aR^.A.X:=0;
  444. aR^.A.Y:=0;
  445. aR^.B.X:=wnd^.Pos.B.X-1;
  446. aR^.B.Y:=wnd^.Pos.B.Y-1;
  447. if (wnd^.Style AND WS_CHILD) = WS_CHILD then Exit;
  448. if wnd^.bActive then
  449. begin
  450. Dec(aR^.B.X, 2*wnd^.Palette^.ActBorderSize);
  451. Dec(aR^.B.Y, 2*wnd^.Palette^.ActBorderSize);
  452. if (wnd^.Style AND WS_TITLE) = WS_TITLE then
  453. Dec(aR^.B.Y,wnd^.Palette^.ActTitleSize);
  454. end
  455. else
  456. begin
  457. Dec(aR^.B.X, 2*wnd^.Palette^.NoActBorderSize);
  458. Dec(aR^.B.Y, 2*wnd^.Palette^.NoActBorderSize);
  459. if (wnd^.Style AND WS_TITLE) = WS_TITLE then
  460. Dec(aR^.B.Y,wnd^.Palette^.NoActTitleSize);
  461. end;
  462. end;
  463. {-----------------------------------}
  464. {$I GDI.pas}
  465. Procedure GetGlobalRect(aH:HWND;aR:LPRECT);
  466. var
  467. wnd, c : PWindow;
  468. begin
  469. wnd := wGetWndByHWND(aH);
  470. if (wnd = nil) or (aR = NIL) then Exit;
  471. wGetGlobalRect(wnd,aR);
  472. end;
  473. {-----------------------------------}
  474. Procedure GlobalToClient(aH:HWND;aX,aY:INT16;aR:LPPOINT);
  475. var
  476. gR : RECT;
  477. begin
  478. GetGlobalRect(aH,@gR);
  479. if aR = nil then exit;
  480. aR^.X := aX-gR.A.X;
  481. aR^.Y := aY-gR.A.Y;
  482. end;
  483. {-----------------------------------}
  484. Function GetParent(aH:HWND):HWND;
  485. var
  486. wnd : PWindow;
  487. begin
  488. GetParent := NULL;
  489. wnd := wGetWndByHWND(aH);
  490. if wnd^.Parent <> nil then
  491. GetParent := wnd^.Parent^.Handle;
  492. end;
  493. {-----------------------------------}
  494. Function GetWindowText(aH:HWND;aS:PString;StrLen:UINT8):UINT8;
  495. var
  496. wnd : PWindow;
  497. begin
  498. wnd := wGetWndByHWND(aH);
  499. if (wnd = nil) OR (AS = nil) then
  500. begin
  501. GetWindowText := 0;
  502. LastError := ERR_BADHANDLE;
  503. Exit;
  504. end;
  505. aS^ := Copy(wnd^.Title^,0,StrLen);
  506. GetWindowText := Length(aS^);
  507. end;
  508. {-----------------------------------}
  509. Function SetWindowText(aH:HWND;aS:PString):UINT8;
  510. var
  511. wnd : PWindow;
  512. begin
  513. wnd := wGetWndByHWND(aH);
  514. if (wnd = nil) OR (AS = nil) then
  515. begin
  516. SetWindowText := 0;
  517. LastError := ERR_BADHANDLE;
  518. Exit;
  519. end;
  520. FreeMem(wnd^.Title,ord(wnd^.Title^[0])+1);
  521. wnd^.Title := Alloc(ord(aS^[0])+1);
  522. wnd^.Title^ := aS^;
  523. SetWindowText := Length(aS^);
  524. wPostMessage(wnd,WM_PAINT,0,0);
  525. end;
  526. {-----------------------------------}
  527. Function FindWindow(aT,aC : PString):HWND;
  528. var
  529. wnd : PWindow;
  530. begin
  531. FindWindow:=NULL;
  532. wnd := AllWindows^.Next;
  533. while (wnd <> nil) do
  534. begin
  535. if (aT <> nil) AND (aT^ = wnd^.Title^) then break;
  536. if (aC <> nil) AND (aC^ = wnd^.wClass^.Name^) then break;
  537. wnd := wnd^.next;
  538. end;
  539. if wnd <> nil then
  540. FindWindow := wnd^.Handle;
  541. end;
  542. {-----------------------------------}
  543. Function FindChildWindow(aH:HWND;aT,aC : PString):HWND;
  544. var
  545. wnd : PWindow;
  546. begin
  547. FindChildWindow:=NULL;
  548. wnd := wGetWndByHWND(aH);
  549. wnd := wnd^.Child^.Brother;
  550. while (wnd <> nil) do
  551. begin
  552. if (aT <> nil) AND (aT^ = wnd^.Title^) then break;
  553. if (aC <> nil) AND (aC^ = wnd^.wClass^.Name^) then break;
  554. wnd := wnd^.Brother;
  555. end;
  556. if wnd <> nil then
  557. FindChildWindow := wnd^.Handle;
  558. end;
  559. {-----------------------------------}
  560. Function PrintChar(SC:UINT8):boolean;
  561. begin
  562. PrintChar := EScanCode(SC) in [SC_Q..SC_P,SC_A..SC_L,SC_Z..SC_M,
  563. SC_1..SC_0,SC_MINUS, SC_EQUAL, SC_BACKSLASH, SC_LBR,SC_RBR,
  564. SC_SEMICOLON,SC_AMPERSAND,SC_COMMA, SC_PERIOD, SC_SLASH,SC_SPACE];
  565. end;
  566. Function AddOnFrameMessage(aH:hWnd):boolean;
  567. var
  568. Wnd:PWindow;
  569. aNew,c : PWndList;
  570. begin
  571. Wnd := wGetWndByHWND(aH);
  572. if Wnd = nil then
  573. begin
  574. LastError := ERR_BADHANDLE;
  575. AddOnFrameMessage := false;
  576. Exit;
  577. end;
  578. New(aNew);
  579. aNew^.Wnd := Wnd;
  580. aNew^.Next := nil;
  581. c := OnFrameList;
  582. if c<>nil then
  583. begin
  584. while c^.Next <> nil do c:=c^.next;
  585. c^.next := aNew;
  586. end
  587. else
  588. OnFrameList := aNew;
  589. AddOnFrameMessage := true;
  590. end;
  591. Function DelOnFrameMessage(aH:hWnd):boolean;
  592. var
  593. Wnd : PWindow;
  594. c,d : PWndList;
  595. begin
  596. DelOnFrameMessage := false; { Be pessimistic :) }
  597. Wnd := wGetWndByHWND(aH);
  598. if Wnd = nil then
  599. begin
  600. LastError := ERR_BADHANDLE;
  601. Exit;
  602. end;
  603. c := OnFrameList;
  604. if c = nil then exit;
  605. if c^.Wnd<>Wnd then
  606. begin
  607. while (C^.Next <> nil) AND (c^.Next^.Wnd <> Wnd) do c:=c^.next;
  608. if c^.next = nil then exit;
  609. d:=c^.next;
  610. c^.next := d^.next;
  611. dispose(d);
  612. end
  613. else
  614. begin
  615. OnFrameList := c^.Next;
  616. Dispose(C);
  617. end;
  618. DelOnFrameMessage:=true;
  619. end;
  620. Function IsKeyActive(aH:HWND):Boolean;
  621. begin
  622. IsKeyActive := KeyActive^.Handle = aH;
  623. end;
  624. END.