回调过程为何没任何反映(高分相送)(200)

  • 主题发起人 zjlqtx110110
  • 开始时间
Z

zjlqtx110110

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做个电话弹屏的功能,即当电话打入时,应用程序会自动从拖盘上弹出。可在回调时却没任何反映。那位大侠请帮我看一下。我用的是USB接口的来电显示盒作为电话与电脑的连接。下面时该来电显示盒的API过程和函数; procedure Setup_Tel(Data:DWORD;B:integer);stdcall; external 'Sandu.dll'; 设定回调函数:(C++) void WINAPI Setup_Tel(void (__stdcall * fPost2User)(unsigned int),int getall=FALSE) 功能:设定回调函数 参数:1 fPost2User 回调函数地址;2 getall=0(默认) 返回值:1 成功;0 失败。 VB函数原型:Declare Sub Setup_Tel Lib "SANDU.DLL" (ByVal fPost2User As Long, ByVal getall As Long) function Begin_Tel(Port:integer;powerchar:char):integer;stdcall ; external 'Sandu.dll'; 1.开启“来电通”函数 :(C++) int WINAPI Begin_Tel(int port,Char app) 功能:开启“来电通” 参数:1 port 端口号,ap 保留 返回值:1 成功;0 失败。 VB函数原型:Declare Function Begin_Tel Lib "SANDU.DLL" (ByVal port As Long, ByVal ap As Long) As Long Delphi函数参考:function Begin_Tel(DIDN:integer;powerchar:Char):integer;stdcall ; far external 'Sandu.dll'; 以下是实现代码: procedure Test(aPort: integer);stdcall; var lpData:pNotifyIconData; // TelNum: pchar; begin if aPort = 0 then begin mainform.IniDevList(nil); end else begin if IsIconic(mainform.Handle)=True then begin lpData := new(PNotifyIconDataA); lpData.cbSize := 88;//SizeOf(PNotifyIconDataA); lpData.Wnd := Mainform.Handle; lpData.hIcon := Mainform.Icon.Handle; lpData.uCallbackMessage := WM_BARICON; lpData.uID :=0; lpData.szTip := 'Samples'; lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; Shell_NotifyIcon(NIM_DELETE,lpData); dispose(lpData); Mainform.Visible := True; end; end; end; procedure Tmainform.IniDevList(Sender: TObject); begin if Begin_Tel(1, #1) = 1 then ldtzt:=1 else ldtzt:=0; procedure Tmainform.FormCreate(Sender: TObject); begin IniDevList(nil); Setup_Tel(DWORD(@Test), 1); end;
 
没人理,我自己顶一下
 
几个不明确的地方:1)回调函数的原型没有写明确,在你示例里,回调函数的原型是type Backcall: procedure (aPort: integer);stdcall;意思是对方回调回来时,会带一个aPort的参数进来,这个参数你代码里当做了一个判断条件,并似乎调用Begin_Tel去做初始化,而这个初始化,在程序刚运行时就做了一次。2)Shell_NotifyIcon的同时,需要配合添加和删除图标的函数才会在托盘里显示,仅仅在回调发生时注册一个托盘通知意义不明。3)托盘的通知和添加、删除,应该是mainForm的行为,加到回调函数里意义不明。4)回调函数在被回调调用到时,应该快速处理,通常是在做一个判断后,向主程序发一个通知就够了,主程序接到通知后,执行相应的动作。这些在你贴出的代码里,我一点都看不见。
 
小雨哥,1)其实这里还有一个时间控件,是检测来电通接上与否的问题,来电通有可能在程序运行中才接上去,所以Begin_Tel去做初始化,而这个初始化,在程序刚运行时就做了一次。2)我在实现弹出窗口时,加入了判断是否应用程序在拖盘上。3)托盘的通知和添加、删除,应该是mainForm的行为,加到回调函数里意义不明。其实我有另外两件过程是最小化到拖盘。和单击拖盘而弹出窗口。加到回调函数是为了当电话打入时。能触发弹出窗口。4)我是根据来电通的附带的实例。来套用了设定回调函数的格式。说句实话,我是个新手。对与这个通过己编好WINDOWS的API函数实现要求一点思路也没有。如果小雨哥帮我解决这个问题,我不但可以送分也可以付钱的。我想这对于有经验的人来说应该不难。我这里来电通二次开发的实例都有。若需要我都可提供。当然谁有兴趣也可和我联系qq:709917468
 
我也不是很清楚你在摆弄的控制器具体怎么工作,但按照你的描述,确实也有些错误存在:1)你可以先不去实现“来电显示”部分,而是先实现一个可以最小化到托盘、可以点击托盘图标而弹出主窗体,再点击主窗体最小化后又缩回托盘的应用程序。这样子你对托盘程序如何实现的,就会有比较好的了解。2)了解了托盘程序是怎么工作的以后,你一定会发现你上面代码中判断是否最小化的代码IsIconic可能是不会在托盘程序里有用的。同时,你也会发现Shell_NotifyIcon不是用来弹出主窗体的,而是让托盘图标与主窗体进行挂钩的通知注册。3)以上清楚了以后,你只要按照逻辑的要求,在适当代码位置嵌入事件触发代码就可以了。比如要让主窗体弹出来,只要执行函数 ShowWindow()就可以。等等。
 
小雨哥在这里我先谢谢你耐心的指导.你说的前两点.我想应该会慢慢的解决先在最主要的问题是这个设定回调函数不起作用.我曾试过在TEST回调函数中进行附值测试.即在TEST中不执行任何操作只执行一条EDIT1.TEXT:='ABCDE';打算在执行Setup_Tel(DWORD(@Test), 1);进入TEST执行这个附值,可是不起任何作用.这个来电通的二次开发有个DEMO.在我刚开始调试这个DEMO时,是成功的即执行Setup_Tel(DWORD(@Test), 1)后会进入TEST中执行.可过了一段日期后,再调试这个DEMO时.执行Setup_Tel(DWORD(@Test), 1)后,TEST却没一点反映,这是为什么.这个DEMO的原代码我根本就没动过呀.[?]
 

Similar threads

顶部