Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Listening to another window resize events in C#

Tags:

I am implementing a small application (observer) that needs to "attach" itself to the bottom of another window (observed). The latter is not a window inside the application.

At this moment I solved by getting the hWnd of the window and querying periodically in a thread the location of the observed window, moving the observer window accordingly.

However this is a very inelegant solution. What I would like to do is to listen to the resize event of the observed window so that the observer will react only when necessary.

I assume I should use a hook, and I found plenty of ways of doing it, but my lack of knowledge of the C WinAPI is blocking me in understanding which hook I need to create and how (pinvoke/parameters/etc).

I'm pretty sure this is quite trivial, and some of you familiar with C/C++ and WinAPI will have the answer ready at hand ;)

Thanks

like image 861
Steve Vedovelli Avatar asked May 21 '10 07:05

Steve Vedovelli


1 Answers

Expanding on Chris Taylor's answer: Instead of doing the native interop yourself, you can use ManagedWinApi, which contains a Hook class.

EDIT: To use ManagedWinApi. Somewhere in your code:

Hook MyHook = new Hook(HookType.WH_CALLWNDPROC, false, false); MyHook.Callback += MyHookCallback; MyHook StartHook(); 

For the callback, reference CallWndProc and CWPSTRUCT:

private static int MyHookCallback(int code, IntPtr wParam, IntPtr lParam, ref bool callNext) {     if (code >= 0)     {         // You will need to define the struct         var message = (CWPSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPSTRUCT));         // Do something with the data     }     return 0; // Return value is ignored unless you set callNext to false } 
like image 96
Daniel Rose Avatar answered Nov 20 '22 12:11

Daniel Rose