|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
SetWindowLong + WS_EX_NOACTIVATE
Привет!
Пытаюсь сделать окно поверх всего, которое при клике не берет на себя фокус. Отображаться оно отображается, а вот с фокусом проблема: "Access violation at address 0. Read of address 0" для SetWindowLong(Frm.Handle, -16, GetWindowLong(Frm.Handle, -16) + 134217728); Скорее всего я накосячил с синтаксисом, но сам разобраться я не смогу потому что знаком с делфи второй день А код такой стремный потому что запускается не в среде разработки, а через стороннюю программу в которую вшит компилятор, ну и потому что я нуб xD Код:
uses SysUtils, StdCtrls, Controls, Forms, Dialogs, Variants, Classes; var Frm : TForm; //Events: TEvents; cbCelestial:TCheckBox; function SetWindowPos(hWnd, hWndInsertAfter: THandle; X, Y, cx, cy: Integer; uFlags: integer): BOOLean; stdcall; external 'user32.dll'; function SetTimer(hWnd: THandle; nIDEvent, uElapse: integer; lpTimerFunc: Pointer): integer; stdcall; external 'user32.dll'; function SetWindowLong(hWnd: THandle; nIndex: integer; dwNewLong: integer): integer; stdcall; external 'user32.dll'; function GetWindowLong(hWnd: THandle; nIndex: integer): integer; stdcall; external 'user32.dll'; procedure MainProc; begin //Events := TEvents.Create; Frm := TForm.Create(nil); Frm.Caption := 'Cardinal'; Frm.BorderStyle := bsDialog; //Frm.Position := poScreenCenter; Frm.FormStyle := fsStayOnTop; Frm.Height := 340; Frm.Width := 130; //Frm.Top := Screen.Height + Frm.Height; //Frm.Left := Screen.Width - Frm.Width; //Frm.OnClose := Events.OnClose; frm.bringtoFront; cbCelestial := TCheckBox.Create(Frm); cbCelestial.left := 10; cbCelestial.top := 5; cbCelestial.Caption := 'Cheked?'; cbCelestial.Parent := Frm; //Frm.Left:= Screen.WorkAreaWidth-Frm.Width; //Frm.Top:= Screen.WorkAreaHeight-Frm.Height; SetWindowLong(Frm.Handle, -16, GetWindowLong(Frm.Handle, -16) + 134217728); Frm.Show; SetTimer(0, 1, 500, @setwinpos); end; procedure setwinpos; begin SetWindowPos(Frm.Handle, -1, 0, 0, 0, 0, 1 or 2 or 16); end; begin MainProc(); end. |