中国开发网: 论坛: 程序员情感CBD: 贴子 632348
pcplayer
我参考这段代码写的,也读不到消息:--->
unit pThread;



interface

uses classes,sysutils,Windows,Messages,Dialogs;

const MY_MESSAGE1 = $BD00 + 01;

Type

{** 消息处理线程类

*;功能 = 添加线程处理消息能力,

*}

TPMsgThread = class(TThread)

private

//窗口句柄

FWndHandle: HWND;

//窗口数据信息

FWndClass: WNDCLASS;

//指向窗口回调函数的指针

FObjectInstance: Pointer;

//初始化窗口数据

procedure InitWnd;

//创建隐藏窗口

procedure CreateWnd;

//注册隐藏窗口

procedure RegistWnd;

procedure DestroyWnd;

//窗口回调函数

procedure pWndProc(var Message: TMessage); virtual;

protected

procedure Execute; override;

procedure DoTerminate; override;

public

constructor Create(CreateSuspended: Boolean); virtual;

property WndHandle: HWND read FWndHandle write FWndHandle;

end;



implementation

const WND_NAME = 'PY20';

{ TPMsgThread }



constructor TPMsgThread.Create(CreateSuspended: Boolean);

begin

inherited Create(CreateSuspended);

FWndHandle := Integer(nil);

InitWnd;

RegistWnd;

CreateWnd;

end;



procedure TPMsgThread.CreateWnd;

begin

if(WndHandle = Integer(nil)) then

WndHandle := CreateWindow(FWndClass.lpszClassName, FWndClass.lpszClassName,

WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU

or WS_MINIMIZEBOX,

GetSystemMetrics(SM_CXSCREEN) div 2,

GetSystemMetrics(SM_CYSCREEN) div 2,

0, 0, 0, 0, FWndClass.hInstance, nil);

//置换窗口回调函数

SetWindowLong(WndHandle, GWL_WNDPROC, Longint(FObjectInstance));

end;



procedure TPMsgThread.DestroyWnd;

begin

UnregisterClass(FWndClass.lpszClassName,FWndClass.hInstance);

DestroyWindow(WndHandle);

end;



procedure TPMsgThread.DoTerminate;

begin

inherited;

DestroyWnd;

end;



procedure TPMsgThread.Execute;

begin

end;



procedure TPMsgThread.InitWnd;

begin

FwndClass.lpszClassName := PChar(WND_NAME);

FWndClass.hInstance := Handle;

FWndClass.lpfnWndProc := @DefWindowProc;

end;



procedure TPMsgThread.pWndProc(var Message: TMessage);

begin

end;



procedure TPMsgThread.RegistWnd;

begin

FObjectInstance := Classes.MakeObjectInstance(pWndProc);

if(FWndClass.hInstance <> Integer(nil)) then

RegisterClass(FWndClass);

end;

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录