背景:通过代码去读另外一个窗体上(调用的dll)的控件,先去加载那个窗体(dll),但是在那个窗体的create事件里面有消息框提示,而我不需要显示这个消息框,这个怎么去做?
或者有什么好的办法去读取窗体上的控件?
或者有什么好的办法去读取窗体上的控件?
解决方案 »
- TListview自绘背景 滚动时重绘背景问题
- 广州急请全职DELPHI高级技术员
- 关于快速拷贝文件的问题,怎样快速拷贝文件,不是使用COPYFILE,SHELL外壳等函数(各位文件、磁盘高手请进!)
- 新手:怎样让progressbar伴随程序显示进度
- Delphi 6 UpDate 2解决的问题
- ?????这里没有高手吗!怎么没人抢分!
- 如何解决远程登录一个电脑后,对方的电脑会被锁定问题?
- 简单的问题,up有分!
- 要区面试了,我要准备点什么呢?来着有人!
- MIDAS中如何处理主表/细表(MASTER/DETAIL),细表/子细表(DETAIL/SUBDETAIL)之间的关系?MASTER/DETAIL
- BDE连接失败的
- 如何让一个整数保留2位小数
有很多dll,我根据名字动态调的,改dll的create代码怎么可能?
SetWindowsHookEx, WH_CBT,在nCode为HCBT_CREATEWND时,判断是不是消息框,是就返回非0值,否则返回0
哥们,再详细一点行吗?
不知道怎么屏蔽,详细指教下var
HookHandle: HHOOK;procedure TForm1.FormCreate(Sender: TObject);
begin
HookHandle:=SetWindowsHookEx(WH_CBT ,TestHookProc,0,GetCurrentThreadID);
end;
function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;
begin
if (Code = HCBT_CREATEWND) then
if PMsg(Msg)^.Message = WM_PAINT then
begin
Exit;
//Form1.Memo1.Lines.Add('123');
end;
Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));
end;
H: HHOOK;function CBTProc( nCode: Integer;
wParam: WPARAM;
lParam: LPARAM
): Integer; stdcall;
var
c, w: PChar;// array[0..99] of Char;
begin
if nCode = HCBT_CREATEWND then
begin
c := PCBTCreateWnd(lParam)^.lpcs^.lpszClass;
w := PCBTCreateWnd(lParam)^.lpcs^.lpszName; if lstrcmp(c, 'TMessageForm') = 0 then //ShowMessage方式
begin//如果是消息窗口
PostMessage(wParam, WM_CLOSE, 0, 0);//关闭它
Result := 0;
Exit;
end; if lstrcmp(w, 'ddd') = 0 then//MessageBox方式
begin//如果是消息窗口
Result := 1;//直接销毁窗口
Exit
end; end;
Result := CallNextHookEx(H, nCode, wParam, lParam)
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
ShowMessage('abc');
//MessageBox(0, 'abc', 'ddd', 0)
end;procedure TForm3.Button2Click(Sender: TObject);
begin
H := SetWindowsHookEx(WH_CBT, @CBTProc, 0, GetCurrentThreadId)
end;procedure TForm3.FormDestroy(Sender: TObject);
begin
if H <> 0 then
UnhookWindowsHookEx(H)
end;ps:问题如果解决就请及时结贴!!!
ShowMessage方式 的可以,
可是MessageBox方式的不行呢???
我主要需要的是MessageBox方式的
哥们,再研究下
不是的,知道了,
把上面那段
if lstrcmp(c, 'TMessageForm') = 0 then //ShowMessage方式
begin//如果是消息窗口
PostMessage(wParam, WM_CLOSE, 0, 0);//关闭它
Result := 0;
Exit;
end;
去掉就可以了假如我是屏蔽加载的dll的messagebox,是不是也是怎么做?
procedure TForm1.Button1Click(Sender: TObject);
var hdll :Thandle;
prodll :Procedure ;
hmainclient :THandle;
begin
hdll := LoadLibrary('Project1.dll');
if hdll <> 0 then
begin
@prodll := GetProcAddress(hdll,pchar('ffun'));
if @prodll <> nil then
begin
hmainclient := Application.MainForm.ClientHandle;
H := SetWindowsHookEx(WH_CBT, @CBTProc, 0, hmainclient);
ShowWindow(hmainclient,SW_HIDE);
prodll;
UnhookWindowsHookEx(H)
end;
end;
end;你帮我看下呢?好像不行,触发不到,指点下
用当前线程
H := SetWindowsHookEx(WH_CBT, @CBTProc, 0, GetCurrentThreadId);
就可以了感谢
s11ss