[code=C++]
///查询桌面句柄 原来在xp 是
HWND hwndParent = ::FindWindow( "Progman", "Program Manager" );
HWND hwndSHELLDLL_DefView = ::FindWindowEx( hwndParent, NULL, "SHELLDLL_DefView", NULL );
HWND hwndSysListView32 = ::FindWindowEx( hwndSHELLDLL_DefView, NULL, "SysListView32", "FolderView" );
//win7 应该是
HWND dwndparent;
HWND dwndviem=NULL;
HWND dwdesktopicon;
dwndparent=FindWindowEx(0,0,L"WorkerW",L"");//获得第一个WorkerW类的窗口
while((!dwndviem)&&dwndparent)
{
dwndviem=FindWindowEx(dwndparent,0,L"SHELLDLL_DefView",0);
dwndparent=FindWindowEx(0,dwndparent,L"WorkerW",L"");
}
dwdesktopicon=FindWindowEx(dwndviem,0,L"SysListView32",L"FolderView");C++代码正常 可以使用 问题在C#了
[/code]
///查询桌面句柄 原来在xp 是
IntPtr vHandle1 = FindWindow("Progman", "Program Manager");//FindWindow("WorkerW", null);//
IntPtr vHandle2 = FindWindowEx(vHandle1, IntPtr.Zero, "SHELLDLL_DefView", null);
IntPtr vHandle = FindWindowEx(vHandle2, IntPtr.Zero, "SysListView32", null);//win7 应该是 IntPtr vHandle1 = FindWindow("WorkerW", null);// FindWindow("Progman", "Program Manager");
IntPtr vHandle2 = FindWindowEx(vHandle1, IntPtr.Zero, "SHELLDLL_DefView", null);
IntPtr vHandle = FindWindowEx(vHandle2, IntPtr.Zero, "SysListView32", null);
if (vHandle==IntPtr.Zero)
{
MessageBox.Show("");
}
这样取不到 spy++查看有好几个 使用循环
IntPtr dwndparent=IntPtr.Zero;
IntPtr dwndviem=IntPtr.Zero;
IntPtr dwdesktopicon=IntPtr.Zero;
dwndparent=FindWindow("WorkerW", null);//获得第一个WorkerW类的窗口
while((dwndviem!=IntPtr.Zero) && dwndparent!=IntPtr.Zero)
{
dwndviem=FindWindowEx(dwndparent, IntPtr.Zero, "SHELLDLL_DefView", null);
if(dwndviem!=IntPtr.Zero){
dwndparent= FindWindowEx(dwndviem, IntPtr.Zero, "SysListView32", null);
break;}
}
这样查找 dwndviem 一直是 0 陷入死循环了 不知道为什么
///查询桌面句柄 原来在xp 是
HWND hwndParent = ::FindWindow( "Progman", "Program Manager" );
HWND hwndSHELLDLL_DefView = ::FindWindowEx( hwndParent, NULL, "SHELLDLL_DefView", NULL );
HWND hwndSysListView32 = ::FindWindowEx( hwndSHELLDLL_DefView, NULL, "SysListView32", "FolderView" );
//win7 应该是
HWND dwndparent;
HWND dwndviem=NULL;
HWND dwdesktopicon;
dwndparent=FindWindowEx(0,0,L"WorkerW",L"");//获得第一个WorkerW类的窗口
while((!dwndviem)&&dwndparent)
{
dwndviem=FindWindowEx(dwndparent,0,L"SHELLDLL_DefView",0);
dwndparent=FindWindowEx(0,dwndparent,L"WorkerW",L"");
}
dwdesktopicon=FindWindowEx(dwndviem,0,L"SysListView32",L"FolderView");C++代码正常 可以使用 问题在C#了
[/code]
///查询桌面句柄 原来在xp 是
IntPtr vHandle1 = FindWindow("Progman", "Program Manager");//FindWindow("WorkerW", null);//
IntPtr vHandle2 = FindWindowEx(vHandle1, IntPtr.Zero, "SHELLDLL_DefView", null);
IntPtr vHandle = FindWindowEx(vHandle2, IntPtr.Zero, "SysListView32", null);//win7 应该是 IntPtr vHandle1 = FindWindow("WorkerW", null);// FindWindow("Progman", "Program Manager");
IntPtr vHandle2 = FindWindowEx(vHandle1, IntPtr.Zero, "SHELLDLL_DefView", null);
IntPtr vHandle = FindWindowEx(vHandle2, IntPtr.Zero, "SysListView32", null);
if (vHandle==IntPtr.Zero)
{
MessageBox.Show("");
}
这样取不到 spy++查看有好几个 使用循环
IntPtr dwndparent=IntPtr.Zero;
IntPtr dwndviem=IntPtr.Zero;
IntPtr dwdesktopicon=IntPtr.Zero;
dwndparent=FindWindow("WorkerW", null);//获得第一个WorkerW类的窗口
while((dwndviem!=IntPtr.Zero) && dwndparent!=IntPtr.Zero)
{
dwndviem=FindWindowEx(dwndparent, IntPtr.Zero, "SHELLDLL_DefView", null);
if(dwndviem!=IntPtr.Zero){
dwndparent= FindWindowEx(dwndviem, IntPtr.Zero, "SysListView32", null);
break;}
}
这样查找 dwndviem 一直是 0 陷入死循环了 不知道为什么
解决方案 »
- 如何给条码增加预览功能
- 实现的效果:点击一行,显示/隐藏 详细信息。
- 寻求一个.NET下好使的加密狗,能有C#例程的最好
- 麻烦懂MVC的进来帮我看看 怎么调用javascript
- c#中select语句中top后动态设置参数怎么做???我出点小问题.急!!!!!!!!!
- 请教Exception在debug模式下和直接运行时候行为不一致的问题
- 如何获取剪贴板更新时的事件?
- 请教一个常用规格判定的算法
- 用过install shield的来帮个忙吧,install shield8.02的注册码哪里有下载?
- 请教如何选择文件夹
- C#做的exe调用delphi做的dll文件里的函数出问题
- web前台页面无法显示
HWND hwndParent,
HWND hwndChildAfter,
LPCTSTR lpszClass,
LPCTSTR lpszWindow
);
Retrieves the window object whose class name and window name match the specified strings.If the function succeeds, the return value is a pointer to the window object having the specified class and window names. If the function fails, the return value is NULL.就是通过你给的字符串来找窗体,如果你说一直是0那么说明没找到。
第一可能性:可能是dwndparent这个祸害。
你用的是FindWindowEx而不是FindWindow,这个API是需要在指定的Handle里面找窗体的。如果你给出的句柄是NULL,那么就永远也找不到子窗体了。
dwndparent=FindWindow("WorkerW", null);这句代码里面,有可能因为你刚刚创建完毕窗体亦或代码的运行速度太快,一次没找出来,导致dwndparent有可能还是NULL。
如果是这种情况,可以使用循环来等待句柄有效。
第二种可能性:字符串的问题
采用spy+看看你要取的句柄的对象的名称是否正确。
dwndparent = FindWindowEx(0,dwndparent,L"WorkerW",L"");
-》
dwndparent = FindWindowEx(dwndviem, IntPtr.Zero, "SysListView32", null);试试这样
dwndparent = FindWindowEx(0,dwndparent,L"WorkerW",L"");
-》
dwndparent = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);
IntPtr vHandle1 = FindWindow("Progman", "Program Manager");//FindWindow("WorkerW", null);//
while (vHandle1!=IntPtr.Zero){
IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");
vHandle2 一直是0 不知道为什么 size 有4 个
if (vHandle2!=IntPtr.Zero){
IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
}
///这里死循环了
}
IntPtr vHandle1 = FindWindow("WorkerW", null);
while (vHandle1!=IntPtr.Zero){
IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");
vHandle2 一直是0 不知道为什么 size 有4 个
if (vHandle2!=IntPtr.Zero){
IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
}
///这里死循环了
}
while (vHandle1!=IntPtr.Zero)
{
IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");
vHandle2 一直是0 不知道为什么 size 有4 个
if (vHandle2!=IntPtr.Zero)
{
IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);
break;
}
///这里死循环了
}
前面就说了,我希望你在IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L""); 这句话打断点,看看你的dwndparent的值是多少。如果是0,就算你while一千一万遍也无济于事的。死循环说明
vHandle2始终等于了IntPtr.Zero,当你Create一个Window的时候,并不能马上就能通过FindWindow找到窗体的。返回的vHandle1 等于IntPtr.Zero。你可以在IntPtr vHandle1 = FindWindow("WorkerW", null);后面加一些代码while(vHandle1 == IntPtr.Zero){IntPtr vHandle1 = FindWindow("WorkerW", null);}
while (vHandle1!=IntPtr.Zero){
IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");
vHandle1 = FindWindow("WorkerW", null);
vHandle2 一直是0 不知道为什么 size 有4 个
if (vHandle2!=IntPtr.Zero){
IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
}
///这里死循环了
}
while (vHandle1!=IntPtr.Zero){
IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");
vHandle1 = FindWindow("WorkerW", null);
vHandle2 一直是0 不知道为什么 size 有4 个
if (vHandle2!=IntPtr.Zero){
IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
}
///这里死循环了
}
while (vHandle1!=IntPtr.Zero){
IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");
vHandle1 = FindWindow("WorkerW", null);
vHandle2 一直是0 不知道为什么 size 有4 个
if (vHandle2!=IntPtr.Zero){
IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
}
///这里死循环了
}
看这里if (vHandle2!=IntPtr.Zero){
IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
}
已经有条件中断