阅读:2406回复:23
用标C弹出界面对话框的问题 (紧急求助) 难道有分也没有人要?
现在用C语言遍了一个win2k的服务,
想在里面截获设备改变消息WM_DEVICECHANGE,并进行相应处理 我在main( )里面CreateDialog一个对话框,但无法获得相应信息 哪位有好办法? 帮帮忙!帮帮忙!给分 :) :) [编辑 - 6/20/03 by fuq_dddd] |
|
|
沙发#
发布于:2003-06-20 10:07
发错地方了吧,这里只灌水! :D
|
|
板凳#
发布于:2003-06-20 10:18
这个问题不属于驱动,发到别的地方更乱
所以就发到这啦 :) 知道方法的给个建议,多谢 :( :( |
|
|
地板#
发布于:2003-06-20 16:01
你想在控制台程序里面打出来一gui的对话框?
|
|
地下室#
发布于:2003-06-20 16:19
是的,
有什么好的建议吗?指点一下 |
|
|
5楼#
发布于:2003-06-20 17:08
就这么一句阿
DialogBox(hInstance, (LPCTSTR)IDD_DLG1, NULL, (DLGPROC)MyDlgProc) ; 随便你是console还是gui都可以跑阿~~~ |
|
|
6楼#
发布于:2003-06-20 17:23
consel里hinstance 就是NULL 阿
奥 是不是要在服务跑的时候察看服务runtime信息---就是要和服务交互? RegisterServiceCtrlHandler( TEXT(my_SVR_name),myServiceCtrlHandler); 让myServiceCtrlHandler函数处理自定义请求 :( |
|
|
7楼#
发布于:2003-06-20 17:28
就这么一句阿我已经试了两种方法: 1. nDlgRet = ::DialogBox(::GetModuleHandle(NULL), 2. g_hProcessPnp = CreateDialog(::GetModuleHandle(NULL), (LPCTSTR)MAKEINTRESOURCE(IDD_PNP), //对话框模板 NULL, //父窗口指针 ProcessPnp); //回调函数 都看不到dialog, 我的主程序是: void _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 难道和这个有关? 我只是想实现一个系统服务,在服务中监测usb端口的pnp事件 因为服务是没有窗口的,所以不接受系统消息, 建立dialog最终是要截获pnp消息,同时向系统发消息 有好建议吗? |
|
|
8楼#
发布于:2003-06-20 17:37
你看了!ddk里面的usbview了吗?
|
|
9楼#
发布于:2003-06-20 17:40
你看了!ddk里面的usbview了吗?看了,但服务的框架是_tmain()的 [编辑 - 6/20/03 by fuq_dddd] |
|
|
10楼#
发布于:2003-06-20 17:43
以下是zt的,作者:BlueInkstone[MS MVP],也就是下面的Ma Qi
不知道对你有没有用。我没有仔细看。:D 服务程序(Service)一般是不能和用户进行交互的,所以他一般是不能显示窗口的。 要和用户进行交互(如显示窗口),我们必须打开用户WinSta0和desktop。 //打开winsta0 hwinsta = OpenWindowStation(\"winsta0\", FALSE, WINSTA_ACCESSCLIPBOARD | WINSTA_ACCESSGLOBALATOMS | WINSTA_CREATEDESKTOP | WINSTA_ENUMDESKTOPS | WINSTA_ENUMERATE | WINSTA_EXITWINDOWS | WINSTA_READATTRIBUTES | WINSTA_READSCREEN | WINSTA_WRITEATTRIBUTES); if (hwinsta == NULL){ LogEvent(_T(\"open window station err\")); return FALSE; } if (!SetProcessWindowStation(hwinsta)){ LogEvent(_T(\"Set window station err\")); return FALSE; } //打开desktop hdesk = OpenDesktop(\"default\", 0, FALSE, DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS); if (hdesk == NULL){ LogEvent(_T(\"Open desktop err\")); return FALSE; } -- Ma Qi Microsoft MVP http://www.blueinkstone.com ----------------------------------------------- VC常见问题列表 |
|
11楼#
发布于:2003-06-20 17:44
呵呵!可以用mfc来创建服务的啊!就是在mfc app里面,把服务控制的一些函数注册,然后返回FALSE啊!
|
|
12楼#
发布于:2003-06-20 17:46
arthurtu
你提供的思路应该是正确的,我去试试 |
|
|
13楼#
发布于:2003-06-20 17:50
呵呵!可以用mfc来创建服务的啊!就是在mfc app里面,把服务控制的一些函数注册,然后返回FALSE啊!能详细说说吗? 具体在mfc app什么位置?如何函数注册? |
|
|
14楼#
发布于:2003-06-20 17:57
俺书看的太不细心了 俺还是回家给老婆做饭了~~ 算了 俺和老婆出去吃吧~~
platform SDK Documentation Base Services DLLs,process and threads Services Platform SDK: DLLs, Processes, and Threads Receiving Device Events in a Service The system broadcasts device change events to all services. These events can be received by a service in a window procedure or in its service control handler. To specify which events your service should receive, use the RegisterDeviceNotification function. When a service calls RegisterDeviceNotification, the service also specifies either a window handle or a service status handle. If a service specifies a window handle, the window procedure receives the notification events. If a service specifies its service status handle, its service control handler receives the notification events. For more information, see HandlerEx. Device notification handles returned by RegisterDeviceNotification must be closed by calling the UnregisterDeviceNotification function when they are no longer needed. Platform SDK Release: August 2001 What did you think of this topic? Let us know. Order a Platform SDK CD Online (U.S/Canada) (International) :( |
|
|
15楼#
发布于:2003-06-20 18:14
这个写的很胡涂 :(
|
|
|
16楼#
发布于:2003-06-20 18:16
有的时候我们的程序需要监控光驱的状况,当用户插入或者取出光盘的时候,我们希望程序能够自动执行某项操作(例如就像资源管理器那样能够在用户更换光盘时自动刷新其光盘信息)。
其实当用户插入或取出光盘时,系统都会产生WM_DEVICECHANGE消息,我们可以加上对这个消息的响应函数OnDeviceChange()来完成这一功能,不过这需要自己手工完成,因为VC++6.0的集成环境不支持这个消息。 具体步骤如下: 首先,在主程序的.H头文件的DECLARE_MESSAGE_MAP()前面,也就是在那些afx_msg开头的消息函数里面加上一行:afx_msg void OnDeviceChange(UINT, DWORD); 然后,在主程序的.CPP文件的BEGIN_MESSAGE_MAP()后面,也就是在消息映射表里面加上一行:ON_WM_DEVICECHANGE() (记住,上面这一行结尾是没有分号的!) 最后就是在主程序的.CPP文件中加上你自己的处理函数OnDeviceChange了,例如下面这样: void CTestDlg::OnDeviceChange(UINT nEventType, DWORD dwData) { if(nEventType == DBT_DEVICEARRIVAL) // 如果是用户插入光盘 { // 在这里加入用户插入光盘后需要执行的操作 } else if(nEventType == DBT_DEVICEREMOVECOMPLETE) // 用户取出光盘 { // 在这里加上用户取出光盘后需要执行的操作 } 可惜我没分了!!! |
|
|
17楼#
发布于:2003-06-20 18:29
WLX_SAS_TYPE_XXXX
这类消息可以从服务中发送到winlogon吗? |
|
|
18楼#
发布于:2003-06-20 19:20
应该是可以的!!!!!服务里边也可以!
|
|
|
19楼#
发布于:2003-06-21 13:19
arthurtu
谢谢 用你提供的方法,可以看到对话框啦, 可是弹出的对话框总是在忙, 就是鼠标在上面就变成沙漏,点什么按钮都没有反应 为什么? |
|
|
上一页
下一页