制作一个简单的应用程序,因此当用户退出Windows时,它当然会关闭应用程序.我们正在制作一个简单的USB警报应用程序,如果在用户注销时检测到USB,STOPS将关闭
到目前为止这是代码.
public Form1()
{
InitializeComponent();
}
private static int WM_QUERYENDSESSION = 0x11;
private static bool systemShutdown = false;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == WM_QUERYENDSESSION)
{
//MessageBox.Show("queryendsession: this is a logoff, shutdown, or reboot");
systemShutdown = true;
m.Result = (IntPtr)0;
}
// If this is WM_QUERYENDSESSION, the closing event should be
// raised in the base WndProc.
m.Result = (IntPtr)0;
base.WndProc(ref m);
} //WndProc
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (systemShutdown)
{
systemShutdown …Run Code Online (Sandbox Code Playgroud) 我正在调试wpf中的拖动错误并订阅了wndproc.我的消息ID为49619,wparam = 0,lparam = 0.我已经筋疲力尽了谷歌的努力,并且无法揭开这个窗口消息的名称.
如果你知道,那很好.如果您可以在其窗口消息列表中提供包含它的网站,那就更好了.
十六进制值= 0xC1D3
我有这个抽象代码:我想在 CreateWindowEx() 中使用 lParam(最后一个参数)来保存指向在 main - SaveArr 开头声明的类的指针。然后,我想在函数 WndProc 中使用它。一开始我做了一个全局数组,然后我可以在任何地方使用它,但就 C++ 而言它不是那么“聪明”,所以我试图升级它。
class Samples
{
int arr[ITERATIONS+1];
int index;
...
}
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
Samples * SaveArr;
...
hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
ClsName,
WindowCaption,
WS_OVERLAPPEDWINDOW,
INITIAL_WIN_LOCAT_X,
INITIAL_WIN_LOCAT_Y,
WIN_WIDTH,
WIN_HIGHT,
NULL,
NULL,
hInstance,
NULL); //here i want to pass SaveArr, so that i can use it in the WndProc(...) function
...
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) …Run Code Online (Sandbox Code Playgroud) 我有一个小问题希望有人会帮助我有没有办法挂钩到其他应用程序wndproc?
情况是我想在其他app菜单中插入菜单,我想为每个菜单项定义命令
我能够使用一些win32api函数(user32.dll)插入带有菜单项的菜单但是我无法设置该菜单项的命令,以便它实际上在点击时执行某些操作
通过一些谷歌搜索,我得到了一些关于wndprocess的信息,我应该拦截发送的ID命令并触发一些功能,但我卡住了.
谁能帮我?
我有一个关于WndProc在我的表单应用程序中使用的基本问题.我想知道WndProc当我有表单事件可用时该方法的用途.在哪些情况下我需要创建自定义消息?MSDN告诉它它仅用于处理Windows消息.
我正在尝试使用.NET WebBrowser类型的Close事件,这似乎不是开箱即用的.(编辑:window.close()在浏览器中运行的脚本中发出调用时会发出此事件.)
一个解决方案,我看到的是,以扩展WebBrowser类override的WndProc方法.
我的扩展代码如下:
type internal ExtendedBrowser () = class
inherit System.Windows.Forms.WebBrowser()
let WM_PARENTNOTIFY : int = 0x0210
let WM_DESTROY : int = 0x0002
let closed : Event<unit> = new Event<unit>()
do ()
[<System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")>]
override this.WndProc (msg : Message byref) =
match msg.Msg with
| wm when wm = WM_PARENTNOTIFY ->
if (not base.DesignMode) && (msg.WParam.ToInt32() = WM_DESTROY)
then closed.Trigger()
base.DefWndProc(ref msg)
| _ ->
base.WndProc(ref …Run Code Online (Sandbox Code Playgroud) 我们有一个WinForms AnyCPU应用程序,其中供应商库控件偶尔会在运行多个监视器的64位用户盒子上抛出以下异常:
System.OverflowException: Arithmetic operation resulted in an overflow.
at VendorLibraryName.VendorControl.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Run Code Online (Sandbox Code Playgroud)
我查看了供应商库控件的WndProc处理程序,看起来它可能产生溢出的唯一代码就是这个(评论我的 - 这是反编译的):
switch (msg)
{
case 132: // NCHITTEST
case 672: // NCMOUSEHOVER
// Technically dangerous: convert IntPtr to Int32 in a 64-bit process.
// However, note that for these message codes,
// LParam represents a "packed" x and y screen-coordinate.
// Given my understanding of how this packing occurs, I can't think
// of how to construct …Run Code Online (Sandbox Code Playgroud) 我的程序是如何开始的:
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
{
MapEditor mapEditor;
mapEditor.Run();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并且有MapEditor():
MapEditor::MapEditor()
{
/* Creates the window */
WNDCLASSEX wClass;
ZeroMemory(&wClass,sizeof(WNDCLASSEX));
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.style=CS_HREDRAW|CS_VREDRAW;
wClass.lpfnWndProc=WinProc;
wClass.cbClsExtra=NULL;
wClass.cbWndExtra=NULL;
wClass.hInstance=GetModuleHandle(0);
wClass.hIcon=NULL;
wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
wClass.lpszMenuName=NULL;
wClass.lpszClassName="Map Editor";
wClass.hIconSm=NULL;
if(!RegisterClassEx(&wClass))
{
int nResult=GetLastError();
MessageBox(NULL,"Failed to register window class","Window Class Failed",MB_ICONERROR);
}
ME_HWnd=CreateWindowEx(NULL,
"Map Editor",
"Map Editor",
WS_OVERLAPPEDWINDOW | WS_MAXIMIZE | WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
GetModuleHandle(0),
this);
if(!ME_HWnd)
{
int nResult=GetLastError();
MessageBox(NULL,"Window class creation failed","Window …Run Code Online (Sandbox Code Playgroud) 编辑: tl;博士去第一条评论.
这个问题源于另一个问题,当鼠标在表格边框上下降时,我的获取MouseDown事件?
在那个问题中,当用户在表单边框上按下鼠标左键(准备拖动)时,我需要有一个表单触发事件,这非常有效.问题是当用户完成此操作时,通过放开鼠标左键,我还想要触发一个事件.
为此,我将此代码生成为"基本形式"类,其他形式将从中派生.我已经删除了FireMouseButton...()简洁的方法; 他们解雇自定义事件.
const int WM_NCLBUTTONUP = 0xA2;
const int WM_NCLBUTTONDWN = 0xA1;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_NCLBUTTONUP)
FireMouseButtonUp();
if (m.Msg == WM_NCLBUTTONDWN)
FireMouseButtonDown();
base.WndProc(ref m);
}
Run Code Online (Sandbox Code Playgroud)
这个问题是WM_NCLBUTTONUP消息没有像我预期的那样发送.在查看了描述后,WM_NCLBUTTONUP我可以看到为什么,
当用户在窗口的非客户区域内释放鼠标左键时,会发布[WM_NCLBUTTONUP].此消息将发布到包含光标的窗口.如果窗口捕获了鼠标,则不会发布此消息.
因为表单在拖动时捕获了鼠标,所以它不会收到WM_NCLBUTTONUP消息.(如果形式最大化的话会这样).这个问题解释得更好一个窗口未最大化时丢失的WM_NCLBUTTONUP消息的奇怪问题.
这个问题的答案有点帮助,但对我来说却引起很多困惑.在下面的代码中我有一个小的SSCCE,它实现了从上面的答案的解决方案给出的一些代码,检查WMNCHITTEST消息以查看鼠标是否已被释放;
这个想法是WM_NCHITTEST当鼠标在表单中移动时应该发送.因此,一旦拖动停止,此消息应与DragStartPointWndProc消息参数中的鼠标位置一起发送; 其中DragStartPoint所述当记录WM_NCLBUTTONDOWN被接收的消息.
但问题是,在WM_NCHITTEST拖动开始后并不总是发送,只有在顶部边框的远端开始拖动时(见下图).在WM_NCLBUTTONDOWN顶部边框(从不为两侧或底部),单击后始终发送消息.所以这很好,但WM_NCHITTEST正如所指出的那样WM_NCLBUTTONUP,但有时只会发送.

如何让WM_NCHITTEST"测试"在下面的代码中工作,以便在用户停止拖动表单后通知我?("测试"正在检查DragStartPointif语句中WM_NCHITTEST …
我想知道是否可以为创建的子窗口指定WndProc CreateWindowEx.
我已经创建了一个Window类,主窗口,窗口过程和一个消息循环.该代码有效,我决定将其保留,以便明确我的问题.
到目前为止,这是我的Window Proc:
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
// Creation of the Win32 Window
case WM_CREATE:
// Add an Edit Field
CreateWindowEx(
WS_EX_CLIENTEDGE,
"EDIT",
"",
WS_CHILD | WS_VISIBLE,
5, 5, 200, 24,
hwnd,
(HMENU)100,
g_Instance, // Comming from WinMain
NULL
);
return DefWindowProc(hwnd, uMsg, lParam, wParam);
case WM_KEYDOWN:
// Track key presses on the edit field
std::cout << "The key with the code " << wParam << " …Run Code Online (Sandbox Code Playgroud)