寻找WPF陡峭的学习曲线.
在好的Windows窗体中,我只是覆盖WndProc,并在它们进入时开始处理消息.
有人能告诉我如何在WPF中实现同样的事情吗?
我正在尝试编写一个类库,它可以捕获Windows消息,以便在已连接或删除设备时通知我.通常,在Windows窗体应用程序中,我只是覆盖WndProc方法,但在这种情况下没有WndProc方法.还有其他方法可以收到消息吗?
我很想知道存储this指针的最佳/常用方法WndProc.我知道几种方法,但据我所知,每种方法都有其自身的缺点.我的问题是:
有哪些不同的方式来生成这种代码:
CWindow::WndProc(UINT msg, WPARAM wParam, LPARAM)
{
this->DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
我可以想到Thunks,HashMaps,Thread Local Storage和Window User Data结构.
每种方法的优点/缺点是什么?
代码示例和建议获得的分数.
这纯粹是出于好奇心.使用MFC之后,我一直想知道它是如何工作的,然后开始考虑ATL等.
编辑:我可以HWND在窗口过程中有效使用的最早的地方是什么?它记录为WM_NCCREATE- 但如果您实际进行实验,那不是第一个发送到窗口的消息.
编辑: ATL使用thunk访问此指针.MFC使用HWNDs 的哈希表查找.
我一直在环顾四周,并没有真正看到有关为什么有人会覆盖wndproc来处理消息的信息.
所以我想知道:
为什么这样?
什么时候做?
它在C#中的一般用途是什么?
当我看到从计算机上插入并拔下插头的串行COM时,我已经尝试过使用它,但我觉得我更好地依赖于我自己创建的方法.
我看到的其他消息是按键,光标设置和其他各种操作.据说大多数这些东西已经在c#库中内置了方法.所以我再回到我的三个主要问题.任何信息,意见,例子等都会很棒.
有没有办法阻止水平滚动条出现在列表视图中?我希望垂直滚动条在需要时显示,但我希望水平滚动条永远不会显示.
我想这会和WndProc有关吗?
谢谢
如果我有一个控制台应用程序,其句柄设置如此;
HWND hWnd = GetConsoleWindow();
Run Code Online (Sandbox Code Playgroud)
那我该如何为窗口设置一个新的wndProc呢?
我试过用
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)conProc);
Run Code Online (Sandbox Code Playgroud)
将conProc定义为
LRESULT CALLBACK conProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_NCHITTEST:
return HTCAPTION;
}
return DefWindowProc(hWnd, msg, wParam, lParam );
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,并说"错误代码:5 - 访问被拒绝" GetLastError()
我知道修改这样的控制台应用程序非常困难,因为它是一个csrss.exe应用程序,但我仍然想尝试..谢谢.
我通过在XAML中设置以下窗口属性创建了一个无边框WPF窗口:
... WindowStyle="None" AllowsTransparency="True" ...
Run Code Online (Sandbox Code Playgroud)
这会导致许多问题:
1)已解决:它不再具有任何内置的调整大小功能
2)已解决:它不再具有任何内置拖动功能
3)已解决:没有顶部工具栏,它不再具有最小化/最大化/恢复/关闭按钮
4)已解决:通过aero快照最大化或设置WindowState可防止它被取消.
5)通过aero快照最大化或设置WindowState将使用整个屏幕作为边界,与窗口工具栏重叠.
6)通过aero快照最大化或设置WindowState似乎包含-7边距,使窗口的每边7个像素超出窗口边缘.
通过制作xaml窗口模板来解决1-3.我使用了不可见的矩形作为句柄区域,后面的一些代码通过覆盖OnApplyTemplate()来应用,通过user32.dll SendMessage(...)附加功能,用于调整大小/移动/最小化/最大化/恢复/关闭.
我在这里找到了#4的答案
我尝试通过WndProc拦截最大化消息并手动设置大小/位置来解决5-6,但是这有一个问题,即将RestoreRegion覆盖到最大化的大小/位置,从而无法恢复窗口.
真正奇怪的是,从顶部边框调整窗口大小到屏幕顶部会触发aero full height snap,没有任何问题.
所以,我已经走了很长的路,但5-6仍然是一个问题......有没有办法手动指定最大化区域?或者,有没有办法设置窗口大小而不影响restoreregion属性?
我正在尝试用Java编写一个简单的应用程序,它将与USB设备通信.USB设备由我使用Microchip微控制器制造.通信相当简单,因为USB设备来自HID类,所以在计算机和设备之间交换64字节的数组.我的程序根据产品ID和供应商ID查找设备,可以写入和读取64个字节,但现在我想检测设备何时连接或断开与计算机的连接.
正如我在Microchip提供的C#程序中看到的那样,WndProc方法被覆盖并处理WM_DEVICECHANGE消息.我的问题是如何使用JNA在Java中完成,我如何覆盖WindowProc方法并处理消息,如果可能的话:),但我希望它是:D
提前谢谢你的答案.
的Gabor.
我有一种情况,我在表单上处理单击和双击鼠标事件.在这两种情况下都必须加载某些内容,但是当发生双击时,我不希望执行附加到单击事件的代码.
有没有办法拦截鼠标点击并检查是否双重或单一,然后适当地执行正确的事件?
也许通过拦截窗户的WndProc或什么?