線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:501
推到 Plurk!
推到 Facebook!

WINDOWS

尚未結案
TUN
一般會員


發表:1
回覆:3
積分:0
註冊:2016-09-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-09-06 09:29:39 IP:220.132.xxx.xxx 訂閱
各位前輩 
用了一個以前的例子想監視系統內的運轉訊息(網路DOWNLOAD的). 用XE10好像不能RUN, 一COMPILE就有ERROR. 能否請前輩幫忙? 例子如下
unit WinProc1;

interface

uses
{$IFDEF WIN32}
WINAPI.Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBTables;
{$ELSE}
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, DB, DBTables, Grids, DBGrids;
{$ENDIF}

type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Table1: TTable;
DataSource1: TDataSource;
//DBGrid1: TDBGrid;
// Table1: TTable;
// DataSource1: TDataSource;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

type
{$IFDEF WIN32}
WParameter = LongInt;
{$ELSE}
WParameter = Word;
{$ENDIF}
LParameter = LongInt;

{Declare a variable to hold the window procedure we are replacing}
var
OldWindowProc : Pointer;

function NewWindowProc(WindowHandle : hWnd;
TheMessage : WParameter;
ParamW : WParameter;
ParamL : LParameter) : LongInt
{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}
begin

{ Process the message of your choice here }
if TheMessage = WM_VSCROLL then begin
ShowMessage('The vertical scrollbar is scrolling!');
end;

{ Exit here and return zero if you want }
{ to stop further processing of the message }

{ Call the old Window procedure to }
{ allow processing of the message. }
NewWindowProc := CallWindowProc(OldWindowProc,
WindowHandle,
TheMessage,
ParamW,
ParamL);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
{ Set the new window procedure for the control }
{ and remember the old window procedure. }
OldWindowProc := Pointer(SetWindowLong(DbGrid1.Handle,
GWL_WNDPROC,
LongInt(NewWindowProc)));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
{ Set the window procedure back }
{ to the old window procedure. }
SetWindowLong(DbGrid1.Handle,
GWL_WNDPROC,
LongInt(OldWindowProc));

end;

end.


(*
{ The program's main source file }
program WinProc;

uses
Forms,
WinProc1 in 'WinProc1.pas' {Form1};

{$R *.RES}

begin
{$IFDEF WIN32}
Application.Initialize;
{$ENDIF}
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
*)

{ end of ti }
------
jian chien
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-09-06 10:00:33 IP:59.125.xxx.xxx 訂閱
請附上完整錯誤訊息。謝謝!
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
TUN
一般會員


發表:1
回覆:3
積分:0
註冊:2016-09-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-09-06 13:55:29 IP:220.132.xxx.xxx 訂閱
procedure TForm1.FormCreate(Sender: TObject);
begin
{ Set the new window procedure for the control }
{ and remember the old window procedure. }
OldWindowProc := Pointer(SetWindowLong(DbGrid1.Handle,
GWL_WNDPROC,
LongInt(NewWindowProc)));//主要是這裡沒法COMPILER
end;
//[dcc32 Error] WinProc1.PAS(80): E2035 Not enough actual parameters.
------
jian chien
P.D.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-09-07 10:53:56 IP:118.160.xxx.xxx 未訂閱
抱歉, 能力有限, 沒能很仔細研究你的CODE,
但有點疑問是 (NewWindowProc) 不是一個函式嗎? 我看你PO的CODE, 要帶參數進來, 但你實際呼叫的是 Int(NewWindowProc), 沒有參數導入, 不知是否有特別的用法?
因為由錯誤來看就是實際參數導入不足的問題
TUN
一般會員


發表:1
回覆:3
積分:0
註冊:2016-09-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2016-09-13 17:51:08 IP:180.217.xxx.xxx 訂閱
謝謝 版主的回覆.  我試了多次後在 
OldWindowProc := Pointer(SetWindowLong(SCROLLBOX1.Handle,
GWL_WNDPROC,
LongInt(
@NewWindowProc)));加@可以編譯
不過 要攔截訊號似乎還不行
------
jian chien
pcplayer99
尊榮會員


發表:142
回覆:734
積分:590
註冊:2003-01-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2016-09-16 15:44:40 IP:36.36.xxx.xxx 訂閱
Not enough actual parameters.--- 这句错误提示,应该死说你的代码里面的某个 function 的 parameters 应该填比如3个,而你只填了2个。

看这段 code,里面好像是使用 Win32 API 对 DBGrid 做了什么设置。能说一下它是要用 DBGrid 实现什么样的功能吗?也许用其它的 Grid 比如 TDBGridEh 也能很容易实现类似功能?
TUN
一般會員


發表:1
回覆:3
積分:0
註冊:2016-09-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2016-09-19 18:35:58 IP:220.132.xxx.xxx 訂閱
謝謝回答

這例題是從網路DOWNLOAD的. 應是用來攔截WS_VSCORLL訊息. 我是想用他來攔截其他程式所有訊息 像CALLBACK
------
jian chien
stacker_liew
初階會員


發表:48
回覆:111
積分:46
註冊:2004-05-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2016-09-20 07:26:42 IP:42.153.xxx.xxx 訂閱
FireMonkey能做這?我還以為是VCL?
===================引 用 TUN 文 章===================
謝謝回答

這例題是從網路DOWNLOAD的. 應是用來攔截WS_VSCORLL訊息. 我是想用他來攔截其他程式所有訊息 像CALLBACK
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2016-09-29 15:41:02 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2017-10-17 10:10:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!