隐藏一个WinForm和从DLL
在我的DDL带回来,我已经定义了以下功能:隐藏一个WinForm和从DLL
extern "C" __declspec(dllexport) void hideme(HWND h) {
//ShowWindow(h, SW_HIDE);
SendMessage(h, WM_SHOWWINDOW, FALSE, 0);
}
正如你所看到的,我已经试过许多东西得到这个工作...
我有它在我的winform声明如下:
typedef void (*HideMe)(HWND);
在我的系统:视窗:形式:Form Load事件中,我有以下代码:
...
HINSTANCE hinst = LoadLibrary(_T("My.dll"));
if (hinst == NULL)
System::Diagnostics::Debug::WriteLine("null hinst");
else
hideme = (HideMe) GetProcAddress(hinst, "hideme");
...
在我的系统:视窗:形式:形式显示的情况下,我有以下代码:
...
hideme((HWND)this->Handle.ToPointer());
...
我认为这个问题必须躺在我送过来的HWND的方式,但我我一直在寻找,并且找不到替代品。
我也试过设置this-> Visible = false;但后来我无法弄清楚如何从DLL中触发它可见(滥用sendmessage?)。
我不是一个C++程序员,我通常只在托管语言程序,所以任何帮助(和耐心表示赞赏。
感谢,
尼克。
NB
我无法解释一个奇怪的是,我不能从WinForm的调用自身的ShowWindow它会抛出了这个宝石。
Error 2 error LNK2028: unresolved token (0A00001E) "extern "C" int __stdcall ShowWindow(struct HWND__ *,int)" ([email protected]@[email protected]@[email protected]) referenced in function "private: void __clrcall CheckMSNCpp::frmMain::frmMain_Shown(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z)
Error 3 error LNK2019: unresolved external symbol "extern "C" int __stdcall ShowWindow(struct HWND__ *,int)" ([email protected]@[email protected]@[email protected]) referenced in function "private: void __clrcall CheckMSNCpp::frmMain::frmMain_Shown(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z)
Error 4 error LNK1120: 2 unresolved externals
[EDIT1]
汉斯帕桑特说:
你 得到的ShowWindow()尝试链接器错误消息也是一个 强烈暗示为什么你当前的代码 不工作。您忘记了添加错误 检查代码,GetProcAddress()可能会失败并返回一个NULL指针 。 它将以“hideme”名称将功能导出为 。在一个32位的 构建中,它将被导出为 “_hideme”,注意下划线。其中添加了 以指示 函数使用__cdecl调用 约定。在 的ShowWindow链接器错误表明C++的名字 装修,你忘了#包括 WINDOWS.H并提出了自己, 不正确,声明的ShowWindow。
这不是正确的方法, 您应该将可见 属性设置为false。就像你试过的。为什么 你不能把它设置为真正的 相当无法猜测。
由于几个原因,你说的话对我来说毫无意义。
1)
的WinForm的进口:
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <stdio.h>
正如你所知道的,WINDOWS.H是在那里。
2)ShowWindor错误不在DLL中,我可以称它为好,它在WinForm代码中。
3)我从来没有导出ShowWindow,只是我自己的功能。
[/ EDIT1]
[EDIT2] 乌韦·凯姆说:
为什么你需要一个额外的DLL,它是 仅仅只是一个包装到另一个DLL 功能?
我会像在例如C#使用 PInvoke从您的托管C++ 应用程序。对于 SendMessage函数签名会(在C#):
的PInvoke的东西,只是没有任何意义,就像评论者说。
至于DLL,它需要是一个DLL,因为我需要一个全局钩子来响应我的热键& WH_CBT。在这种情况下,我希望程序开始隐藏&只是在按下组合键时显示设置屏幕。
程序中的所有内容都按预期工作,热键工作起来就像是一种魅力,我唯一无法理解的细节就是显示由DLL触发的应用程序。 [/ EDIT2]
[EDIT3] 示例代码为:http://www.nickkusters.com/CPP_PROBLEM_Demo-NOBIN.zip [/ EDIT3]
为什么你需要一个额外的DLL,它仅仅只是一个包装到另一个DLL中的函数?
我会像在例如C#由using PInvoke from your managed C++ application。对于SendMessage
签名会(在C#):
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(
IntPtr hWnd,
UInt32 Msg,
IntPtr wParam,
IntPtr lParam);
在C++/CLI程序中使用pinvoke几乎没有什么意义。 – 2011-05-28 14:47:32
编辑我的帖子以添加您的评论和回复,以清楚说明。无法在评论中进行格式设置。 – NKCSS 2011-05-28 16:45:39
你在的ShowWindow()尝试了链接器错误消息也是为什么你当前的代码是不工作强烈暗示。您忘了添加错误检查代码,GetProcAddress()可能会失败并返回一个NULL指针。它会,该功能不会被“hideme”名称导出。在32位版本中,它将作为“_hideme”导出,请注意下划线。添加了哪个以指示函数使用__cdecl调用约定。 ShowWindow上的链接器错误演示了C++的名字装饰,你忘记了#include windows.h,并为ShowWindow组成了你自己的,不正确的声明。
这不是正确的做法,您应该将Visible属性设置为false。就像你试过的。为什么你不能把它设置回真实是不可想象的。
这是很多层面上的奇怪。不需要直接win32来隐藏表单。在任何情况下都不需要DLL,可以使用Pinvoke。从托管的C++中,你可以直接调用win api。最后你不会发送这条消息,它会发送给你。再次阅读文档。在win api中隐藏窗口调用ShowWindow。 – 2011-05-28 14:51:16
我很想这样做,但调用ShowWindow与此 - > Handle.ToPointer()不起作用。 – NKCSS 2011-05-28 17:02:29
看起来我们无法帮到你。祝你好运。 – 2011-05-28 18:29:08