标签: wndproc

WM_QUERYENDSESSION给我带来了麻烦

制作一个简单的应用程序,因此当用户退出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)

c# wndproc

6
推荐指数
1
解决办法
4130
查看次数

WndProc消息= 49619 - 它是什么?

我正在调试wpf中的拖动错误并订阅了wndproc.我的消息ID为49619,wparam = 0,lparam = 0.我已经筋疲力尽了谷歌的努力,并且无法揭开这个窗口消息的名称.

如果你知道,那很好.如果您可以在其窗口消息列表中提供包含它的网站,那就更好了.

十六进制值= 0xC1D3

c# wndproc window-messages

6
推荐指数
1
解决办法
681
查看次数

发送 lparam 作为指向类的指针,并在 WndProc() 中使用它

我有这个抽象代码:我想在 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)

c++ winapi wndproc

5
推荐指数
1
解决办法
5785
查看次数

挂钩到另一个应用程序的wndproc?

我有一个小问题希望有人会帮助我有没有办法挂钩到其他应用程序wndproc?

情况是我想在其他app菜单中插入菜单,我想为每个菜单项定义命令

我能够使用一些win32api函数(user32.dll)插入带有菜单项的菜单但是我无法设置该菜单项的命令,以便它实际上在点击时执行某些操作

通过一些谷歌搜索,我得到了一些关于wndprocess的信息,我应该拦截发送的ID命令并触发一些功能,但我卡住了.

谁能帮我?

python winapi wndproc

5
推荐指数
1
解决办法
1036
查看次数

当我有表格活动时,为什么要使用WndProc?

我有一个关于WndProc在我的表单应用程序中使用的基本问题.我想知道WndProc当我有表单事件可用时该方法的用途.在哪些情况下我需要创建自定义消息?MSDN告诉它它仅用于处理Windows消息.

.net wndproc winforms

5
推荐指数
1
解决办法
618
查看次数

WndProc重载时抛出异常

我正在尝试使用.NET WebBrowser类型的Close事件,这似乎不是开箱即用的.(编辑:window.close()在浏览器中运行的脚本中发出调用时会发出此事件.)

一个解决方案,我看到的是,以扩展WebBrowseroverrideWndProc方法.

我的扩展代码如下:

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)

.net f# exception wndproc winforms

5
推荐指数
1
解决办法
1346
查看次数

Unexplained OverflowException将表示屏幕坐标的IntPtr转换为Int32

我们有一个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)

.net c# winapi wndproc winforms

5
推荐指数
1
解决办法
1928
查看次数

我应该怎么做让WS_MAXIMIZE工作?

我的程序是如何开始的:

   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)

c++ oop winapi wndproc

5
推荐指数
1
解决办法
1817
查看次数

WM_NCLBUTTONUP消息在拖动表单结尾时没有发送,怎么办?

编辑: 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 …

c# wndproc winforms

5
推荐指数
0
解决办法
1062
查看次数

为子Windows指定窗口过程

我想知道是否可以为创建的子窗口指定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)

c++ windows winapi wndproc createwindowex

5
推荐指数
1
解决办法
2833
查看次数

标签 统计

wndproc ×10

winapi ×5

c# ×4

winforms ×4

.net ×3

c++ ×3

createwindowex ×1

exception ×1

f# ×1

oop ×1

python ×1

window-messages ×1

windows ×1